<?php
/**
 * @package     Sven.Bluege
 * @subpackage  com_eventgallery
 *
 * @copyright   Copyright (C) 2005 - 2019 Sven Bluege All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

jimport( 'joomla.application.component.modellist' );

class EventgalleryModelOrders extends JModelList
{

    protected $context = 'orders';

    /**
     * Constructor.
     *
     * @param   array $config An optional associative array of configuration settings.
     * @see     JController
     * @since   1.6
     */
    public function __construct($config = array())
    {
        if (empty($config['filter_fields']))
        {
            $config['filter_fields'] = array(
                'id',
                'documentno',
                'total',
                'orderstatusid',
                'paymentstatusid',
                'shippingstatusid'
            );
        }
        parent::__construct($config);
    }
	
	/**
	 * Returns the query
	 * @return string The query to be used to retrieve the rows from the database
	 */
	function getListQuery()
	{

		// Create a new query object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);
		
		$query->select('*');
		$query->from('#__eventgallery_order');

        // Filter by order status.
        $orderstatusid = $this->getState('filter.orderstatus');
        if ($orderstatusid && $orderstatusid!='*')
        {
            $query->where('orderstatusid = '.(int) $orderstatusid);
        }

        // Filter by payment status.
        $paymentstatusid = $this->getState('filter.paymentstatus');
        if ($paymentstatusid && $paymentstatusid!='*')
        {
            $query->where('paymentstatusid = '.(int) $paymentstatusid);
        }

        // Filter by shipping status.
        $shippingstatusid = $this->getState('filter.shippingstatus');
        if ($shippingstatusid && $shippingstatusid!='*')
        {
            $query->where('shippingstatusid = '.(int) $shippingstatusid);
        }

        // Filter by search in title
        $search = $this->getState('filter.search');
        if (!empty($search))
        {
            if (stripos($search, 'id:') === 0)
            {
                $query->where('id = '. $db->escape(substr($search, 3)));
            } else {
                $search = $db->quote('%'.$db->escape($search, true).'%');
                $query->where('(documentno LIKE '.$search.' OR email LIKE '.$search.' OR message LIKE '.$search.')');
            }
        }


        // Add the list ordering clause.
        $orderCol	= $this->state->get('list.ordering');
        $orderDirn	= $this->state->get('list.direction');

        if ($orderCol == 'documentno') {
	        $query->order('cast('.$db->escape($orderCol).' as unsigned) '.$db->escape($orderDirn));
	    } else {
	        $query->order($db->escape($orderCol.' '.$orderDirn));
	    }



		return $query;
	}


    protected function _getList($query, $limitstart = 0, $limit = 0)
    {
        /**
         * @var EventgalleryLibraryFactoryOrder $orderFactory
         */
        $orderFactory = EventgalleryLibraryFactoryOrder::getInstance();

        $this->_db->setQuery($query, $limitstart, $limit);
        $result = $this->_db->loadObjectList();

        $objects = array();
        foreach($result as $item) {
           array_push($objects, $orderFactory->getOrderById($item->id));
        }

        return $objects;
    }

    /**
     * Method to auto-populate the model state.
     *
     * Note. Calling getState in this method will result in recursion.
     *
     * @since   1.6
     * @param null $ordering
     * @param null $direction
     */
    protected function populateState($ordering = null, $direction = null)
    {
        // set the search state
        $search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
        $this->setState('filter.search', $search);
        // Load the filter state.
        $search = $this->getUserStateFromRequest($this->context.'.filter.orderstatus', 'filter_orderstatus');
        $this->setState('filter.orderstatus', $search);
        $search = $this->getUserStateFromRequest($this->context.'.filter.paymentstatus', 'filter_paymentstatus');
        $this->setState('filter.paymentstatus', $search);
        $search = $this->getUserStateFromRequest($this->context.'.filter.shippingstatus', 'filter_shippingstatus');
        $this->setState('filter.shippingstatus', $search);


        // List state information.
        parent::populateState('documentno', 'desc');
    }

    /**
     * Method to get a store id based on model configuration state.
     *
     * This is necessary because the model is used by the component and
     * different modules that might need different sets of data or different
     * ordering requirements.
     *
     * @param   string  $id	A prefix for the store id.
     * @return  string  A store id.
     * @since   1.6
     */
    protected function getStoreId($id = '')
    {
        // Compile the store id.
        $id .= ':' . $this->getState('filter.search');
        $id .= ':' . $this->getState('filter.orderstatus');
        $id .= ':' . $this->getState('filter.paymentstatus');
        $id .= ':' . $this->getState('filter.shippingstatus');

        return parent::getStoreId($id);
    }
}
