<?php

/**
 * Gifts
 * 
 * @author marsilea15 <marsilea15@gmail.com> 
 */
class ControllerModuleModGifts extends Controller {
	
	private $_version	= '1.0.5';
	
	/**
	 * Lista błędów
	 *
	 * @var array
	 */
	private $error = array();
	
	public function __construct($registry) {
		parent::__construct($registry);
	}

	/**
	 * Inicjuj
	 */
	private function _init( $tab ) {		
		// załaduj język
		$this->data = array_merge($this->data, $this->language->load('module/mod_gifts'));
		
		// aktywna zakładka
		$this->data['tab_active'] = $tab;
		
		// linki zakładek
		$this->data['tab_gifts_link']		= $this->url->link('module/mod_gifts', 'token=' . $this->session->data['token'], 'SSL');
		$this->data['tab_groups_link']		= $this->url->link('module/mod_gifts/groups', 'token=' . $this->session->data['token'], 'SSL');
		$this->data['tab_settings_link']	= $this->url->link('module/mod_gifts/settings', 'token=' . $this->session->data['token'], 'SSL');
		$this->data['tab_about_link']		= $this->url->link('module/mod_gifts/about', 'token=' . $this->session->data['token'], 'SSL');
		
		// linki
		$this->data['action']	= $this->url->link('module/mod_gifts' . ( $tab != 'gifts' ? '/' . $tab : '' ), 'token=' . $this->session->data['token'], 'SSL');
		$this->data['back']		= $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');
		
		// okruszki
		$this->data['breadcrumbs'] = array();
		
   		$this->data['breadcrumbs'][] = array(
       		'text'      => $this->language->get('text_home'),
			'href'      => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'),
      		'separator' => false
   		);

   		$this->data['breadcrumbs'][] = array(
       		'text'      => $this->language->get('text_module'),
			'href'      => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'),
      		'separator' => ' :: '
   		);
		
   		$this->data['breadcrumbs'][] = array(
       		'text'      => $this->language->get('heading_title'),
			'href'      => $this->url->link('module/mod_gifts', 'token=' . $this->session->data['token'], 'SSL'),
      		'separator' => ' :: '
   		);
		
		// tytuł
		$this->document->setTitle($this->language->get('heading_title'));
		
		// ustawienia szablonu
		$this->template = 'module/mod_gifts' . ( $tab != 'gifts' ? '_' . $tab : '' ) . '.tpl';
		$this->children = array(
			'common/header',
			'common/footer'
		);
	}
	
	/**
	 * Lista prezentów
	 */
	public function index() {
		$this->_init( 'gifts' );
		
		// załaduj modele
		$this->load->model('mod_gifts/gift');
		
		// linki
		$this->data['insert'] = $this->url->link('module/mod_gifts/insertGift', 'token=' . $this->session->data['token'], 'SSL');
		
		// parametry
		$page = isset( $this->request->get['page'] ) ? $this->request->get['page'] : 1;
		
		// url
		$url = $this->_url();
		
		// pobierz listę prezentów
		$this->data['gifts'] = array();
		
		$this->load->model('tool/image');
 
    	foreach( $this->model_mod_gifts_gift->getGifts(array( 'page' => $page )) as $result ) {
			$action = array();
						
			$action[] = array(
				'text' => $this->language->get('text_edit'),
				'href' => $this->url->link('module/mod_gifts/updateGift', $url . '&gift_id=' . $result['gift_id'], 'SSL')
			);
						
			$this->data['gifts'][] = array(
				'gift_id'		=> $result['gift_id'],
				'name'			=> $result['name'],
				'image'			=> $this->model_tool_image->resize($result['image'] && file_exists(DIR_IMAGE . $result['image']) ? $result['image'] : 'no_image.jpg', 40, 40),
				'status'		=> $result['status'],
				'sort_order'	=> $result['sort_order'],
				'selected'		=> isset( $this->request->post['selected'] ) && in_array( $result['gift_id'], $this->request->post['selected'] ),
				'action'		=> $action
			);
		}
		
		// powiadomienia
		if( isset( $this->session->data['success'] ) ) {
			$this->data['_success'] = $this->session->data['success'];
			
			unset( $this->session->data['success'] );
		}
		
		// paginacja
		$pagination			= new Pagination();
		$pagination->total	= $this->model_mod_gifts_gift->getTotalGifts();
		$pagination->page	= $page;
		$pagination->limit	= $this->config->get('config_admin_limit');
		$pagination->text	= $this->language->get('text_pagination');
		$pagination->url	= $this->url->link('module/mod_gifts', 'token=' . $this->session->data['token'] . '&page={page}', 'SSL');
		
		$this->data['pagination'] = $pagination->render();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/deleteGift', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Formularz dodawania prezentu
	 */
	private function _giftForm() {
		// załaduj modele
		$this->load->model('mod_gifts/gift');
		
		// pobierz informacje o prezencie
		$gift	= isset( $this->request->get['gift_id'] ) ? $this->model_mod_gifts_gift->getGift( $this->request->get['gift_id'] ) : array();
		
		$this->_setParams(array(
			'sort_order' => '0', 'status' => '1', 'product_id' => '', 'name' => ''
		), $gift);
		
		// aktywna zakładka
		$this->data['tab_active'] = 'gifts';
		
		// parametry
		$this->data['token']		= $this->session->data['token'];
		
		// linki
		$this->data['back'] = $this->url->link('module/mod_gifts', 'token=' . $this->session->data['token'], 'SSL');
		
		// błędy
		$this->_setErrors(array(
			'warning' => '', 'product' => ''
		));
		
		// szablon
		$this->template = 'module/mod_gifts_gift_form.tpl';
	}
	
	/**
	 * Formularz dodawania groupy
	 */
	private function _groupForm() {
		// załaduj modele
		$this->load->model('localisation/language');
		$this->load->model('mod_gifts/gift');
		
		// lista języków
		$this->data['languages'] = $this->model_localisation_language->getLanguages();
		
		// pobierz informacje o grupie
		$group	= isset( $this->request->get['group_id'] ) ? $this->model_mod_gifts_gift->getGroup( $this->request->get['group_id'] ) : array();
		
		$this->_setParams(array(
			'amount'				=> '', 
			'status'				=> '1', 
			'visible_on_list'		=> '1', 
			'type'					=> 'first_order',
			'group_description'		=> isset( $group['group_id'] ) ? $this->model_mod_gifts_gift->getGroupDescriptions( $group['group_id'] ) : array(),
			'items'					=> '-1'
		), $group);
		
		// aktywna zakładka
		$this->data['tab_active'] = 'groups';
		
		// parametry
		$this->data['token']		= $this->session->data['token'];
		
		// linki
		$this->data['back']		= $this->url->link('module/mod_gifts/groups', 'token=' . $this->session->data['token'], 'SSL');
		
		// prezenty
		$this->load->model('tool/image');
		
		$this->data['gifts']		= array();
		
		foreach( $this->model_mod_gifts_gift->getGifts() as $gift ) {
			$gift['image'] = $this->model_tool_image->resize($gift['image'] && file_exists(DIR_IMAGE . $gift['image']) ? $gift['image'] : 'no_image.jpg', 40, 40);
			
			$this->data['gifts'][] = $gift;
		}
		
		$this->data['group_items']	= array();
		$this->data['currency']		= $this->currency;
		
		if( isset( $group['group_id'] ) )
			foreach( $this->model_mod_gifts_gift->getGroupItems( $group['group_id'] ) as $item )
				$this->data['group_items'][] = $item['gift_id'];
		
		// błędy
		$this->_setErrors(array(
			'warning' => '', 'amount' => '', 'group_item' => ''
		));
		
		// szablon
		$this->template = 'module/mod_gifts_group_form.tpl';
	}
	
	/**
	 * @return string
	 */
	private function _url( $values = array() ) {
		$params	= array( 'page', 'gift_id', 'group_id' );
		$url	= array(
			'token' => 'token=' . $this->session->data['token']
		);
		
		foreach( $params as $name ) {
			$value = '';
			
			if( isset( $values[$name] ) ) {
				$value = $values[$name];
			} elseif( isset( $this->request->get[$name] ) ) {
				$value = $this->request->get[$name];
			}
			
			if( $value )
				$url[$name] = $name . '=' . $value;
		}
			
		return implode( '&', $url );
	}
	
	/**
	 * Ustaw parametry
	 * 
	 * @param array $params
	 * @param array $record
	 */
	private function _setParams( $params, $record = NULL ) {
		if( ! $record )
			$record = array();
		
		foreach( $params as $param => $default ) {
			if( isset( $this->request->post[$param] ) )
				$this->data[$param] = $this->request->post[$param];
			else if( isset( $record[$param] ) )
				$this->data[$param] = $record[$param];
			else
				$this->data[$param] = $default;
		}
	}
	
	/**
	 * Ustaw błędy
	 * 
	 * @param array $errors
	 */
	private function _setErrors( $errors ) {
		foreach( $errors as $name => $default ) {
			$this->data['_error_' . $name] = isset( $this->error[$name] ) ? $this->error[$name] : $default;
		}
	}
	
	/**
	 * Dodaj nowy prezent
	 */
	public function insertGift() {
		$this->_init( 'insertGift' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateGiftForm() ) {
			$this->load->model('mod_gifts/gift');
			$this->model_mod_gifts_gift->addGift( $this->request->post );
			
			$this->session->data['success'] = $this->language->get('text_success');
			
			$this->redirect($this->url->link('module/mod_gifts', $this->_url(), 'SSL'));
		}
		
		// inicjuj formularz
		$this->_giftForm();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/insertGift', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Dodaj nową grupę
	 */
	public function insertGroup() {
		$this->_init( 'insertGroup' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateGroupForm() ) {
			$this->load->model('mod_gifts/gift');
			$this->model_mod_gifts_gift->addGroup( $this->request->post );
			
			$this->session->data['success'] = $this->language->get('text_success');
			
			$this->redirect($this->url->link('module/mod_gifts/groups', $this->_url(), 'SSL'));
		}
		
		// inicjuj formularz
		$this->_groupForm();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/insertGroup', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Aktualizuj prezent
	 */
	public function updateGift() {
		$this->_init( 'updateGift' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateGiftForm() ) {
			$this->load->model('mod_gifts/gift');
			$this->model_mod_gifts_gift->updateGift( $this->request->get['gift_id'], $this->request->post );
			
			$this->session->data['success'] = $this->language->get('text_success');
			
			$this->redirect($this->url->link('module/mod_gifts', $this->_url(array('gift_id'=>'')), 'SSL'));
		}
		
		// inicjuj formularz
		$this->_giftForm();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/updateGift', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Aktualizuj grupę
	 */
	public function updateGroup() {
		$this->_init( 'updateGift' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateGroupForm() ) {
			$this->load->model('mod_gifts/gift');
			$this->model_mod_gifts_gift->updateGroup( $this->request->get['group_id'], $this->request->post );
			
			$this->session->data['success'] = $this->language->get('text_success');
			
			$this->redirect($this->url->link('module/mod_gifts/groups', $this->_url(array('group_id'=>'')), 'SSL'));
		}
		
		// inicjuj formularz
		$this->_groupForm();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/updateGroup', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Usuń prezent
	 */
	public function deleteGift() {
		$this->_init( 'deleteGift' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && ! empty( $this->request->post['selected'] ) ) {
			$this->load->model('mod_gifts/gift');
			
			foreach( $this->request->post['selected'] as $gift_id )
				$this->model_mod_gifts_gift->deleteGift( $gift_id );
			
			$this->session->data['success'] = $this->language->get('text_success');
		}
		
		$this->redirect($this->url->link('module/mod_gifts', $this->_url(), 'SSL'));
	}
	
	/**
	 * Usuń grupę
	 */
	public function deleteGroup() {
		$this->_init( 'deleteGroup' );
		
		// sprawdź formularz
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && ! empty( $this->request->post['selected'] ) ) {
			$this->load->model('mod_gifts/gift');
			
			foreach( $this->request->post['selected'] as $group_id )
				$this->model_mod_gifts_gift->deleteGroup( $group_id );
			
			$this->session->data['success'] = $this->language->get('text_success');
		}
		
		$this->redirect($this->url->link('module/mod_gifts/groups', $this->_url(), 'SSL'));
	}
	
	/**
	 * Lista grup
	 */
	public function groups() {
		$this->_init( 'groups' );
		
		// załaduj modele
		$this->load->model('mod_gifts/gift');
		
		// linki
		$this->data['insert'] = $this->url->link('module/mod_gifts/insertGroup', $this->_url(), 'SSL');
		
		// parametry
		$page = isset( $this->request->get['page'] ) ? $this->request->get['page'] : 1;
		
		// pobierz listę grup
		$this->data['groups'] = array();
 
    	foreach( $this->model_mod_gifts_gift->getGroups(array( 'page' => $page )) as $result ) {
			$action = array();
			
			$action[] = array(
				'text' => $this->language->get('text_edit'),
				'href' => $this->url->link('module/mod_gifts/updateGroup', $this->_url(array( 'group_id' => $result['group_id'] )), 'SSL')
			);
						
			$this->data['groups'][] = array(
				'group_id'			=> $result['group_id'],
				'amount'			=> $result['amount'],
				'status'			=> $result['status'],
				'visible_on_list'	=> $result['visible_on_list'],
				'type'				=> $result['type'],
				'name'				=> $result['name'],
				'selected'			=> isset( $this->request->post['selected'] ) && in_array( $result['gift_id'], $this->request->post['selected'] ),
				'action'			=> $action
			);
		}
		
		// powiadomienia
		if( isset( $this->session->data['success'] ) ) {
			$this->data['_success'] = $this->session->data['success'];
			
			unset( $this->session->data['success'] );
		}
		
		// paginacja
		$pagination			= new Pagination();
		$pagination->total	= $this->model_mod_gifts_gift->getTotalGroupGifts();
		$pagination->page	= $page;
		$pagination->limit	= $this->config->get('config_admin_limit');
		$pagination->text	= $this->language->get('text_pagination');
		$pagination->url	= $this->url->link('module/mod_gifts/groups', $this->_url(array('page' => '{page}')), 'SSL');
		
		$this->data['pagination'] = $pagination->render();
		
		// linki
		$this->data['action'] = $this->url->link('module/mod_gifts/deleteGroup', $this->_url(), 'SSL');
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Ustawienia
	 */
	public function settings() {
		$this->_init( 'settings' );
		
		// załaduj modele
		$this->load->model('localisation/language');
		$this->load->model('setting/setting');
		$this->load->model('design/layout');
		
		// lista języków
		$this->data['languages'] = $this->model_localisation_language->getLanguages();
				
		if( $this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateSettingsForm() ) {			
			$this->model_setting_setting->editSetting('mod_gifts', $this->request->post);		
					
			$this->session->data['success'] = $this->language->get('text_success');
						
			$this->redirect($this->url->link('module/mod_gifts/settings', 'token=' . $this->session->data['token'], 'SSL'));
		}
		
		$this->_setParams(array(
			'mod_gifts_description'	=> (array) $this->config->get('mod_gifts_description'),
			'modules'				=> (array) $this->config->get('mod_gifts_module'),
			'mod_gifts_image_width'	=> $this->config->get('mod_gifts_image_width'),
			'mod_gifts_image_height'=> $this->config->get('mod_gifts_image_height'),
			'settings'				=> (array) $this->config->get('mod_gifts_settings')
		), array());
		
		// powiadomienia
		if( isset( $this->session->data['success'] ) ) {
			$this->data['_success'] = $this->session->data['success'];
			
			unset( $this->session->data['success'] );
		}
		
		// parametry
		$this->data['token']					= $this->session->data['token'];
		$this->data['layouts']					= $this->model_design_layout->getLayouts();
		
		// linki
		$this->data['back']		= $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');
		
		// błędy
		$this->_setErrors(array(
			'warning' => '', 'image_size' => array()
		));
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * About
	 */
	public function about() {
		$this->_init( 'about' );
		
		$this->data['module_version'] = $this->_version;
				
		$this->response->setOutput( $this->render() );
	}
	
	/**
	 * Instalacja
	 */
	public function install() {		
		$this->language->load('module/mod_gifts');
		
		// załaduj modele
		$this->load->model('setting/setting');
		$this->load->model('mod_gifts/gift');
		
		// utwórz tabele w bazie danych
		$this->model_mod_gifts_gift->install();
		
		// ustaw wartości domyślne
		$this->model_setting_setting->editSetting('mod_gifts', array(
			'mod_gifts_image_width'		=> 100,
			'mod_gifts_image_height'	=> 100
		));	
			
		/**
		 * Sprawdź czy wtyczka jest na liście 
		 */
		$this->load->model('setting/extension');
			
		if( ! in_array( 'mod_gifts', $this->model_setting_extension->getInstalled('module') ) )
			$this->model_setting_extension->install('module', 'mod_gifts');
		
		$this->session->data['success'] = $this->language->get('success_install');

		$this->redirect($this->url->link('module/mod_gifts', 'token=' . $this->session->data['token'], 'SSL'));
	}
	
	/**
	 * Deinstalacja
	 */
	public function uninstall() {		
		$this->language->load('module/mod_gifts');
		
		// usuń tabele w bazie danych
		$this->load->model('mod_gifts/gift');
		$this->model_mod_gifts_gift->uninstall();		
			
		/**
		 * Sprawdź czy wtyczka jest na liście 
		 */
		$this->load->model('setting/extension');
			
		if( in_array( 'mod_gifts', $this->model_setting_extension->getInstalled('module') ) )
			$this->model_setting_extension->uninstall('module', 'mod_gifts');
		
		$this->session->data['success'] = $this->language->get('success_uninstall');

		// przekieruj do listy modułów
		$this->redirect( $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL') );
	}
	
	/**
	 * Zweryfikuj prawnienia
	 * 
	 * @return boolean
	 */
	protected function hasPermission() {
		if( ! $this->user->hasPermission('modify', 'module/mod_gifts') )
			return false;
		
		return true;
	}
	
	/**
	 * Walidacja formularza dodawania prezentów
	 * 
	 * @return boolean
	 */
	private function validateGiftForm() {
		// uprawnienia
		if( ! $this->hasPermission() )
			$this->error['warning'] = $this->language->get('error_permission');
		
		// spr. czy wybrano produkt
		if( ! $this->request->post['product_id'] )
			$this->error['product'] = $this->language->get('error_product');
		
		return $this->__validate();
	}
	
	/**
	 * Walidacja formularza dodawania grupy
	 * 
	 * @return boolean
	 */
	private function validateGroupForm() {
		// uprawnienia
		if( ! $this->hasPermission() )
			$this->error['warning'] = $this->language->get('error_permission');
		
		if( empty( $this->request->post['amount'] ) )
			$this->error['amount'] = $this->language->get('error_amount');
		
		if( empty( $this->request->post['group_item'] ) )
			$this->error['group_item'] = $this->language->get('error_group_item');
		
		$this->request->post['items'] = (int) $this->request->post['items'];
		
		if( ! $this->request->post['items'] )
			$this->request->post['items'] = '-1';
		
		return $this->__validate();
	}
	
	/**
	 * Walidacja formularza zmiany ustawień
	 * 
	 * @return boolean
	 */
	private function validateSettingsForm() {
		// uprawnienia
		if( ! $this->hasPermission() )
			$this->error['warning'] = $this->language->get('error_permission');
		
		if( isset( $this->request->post['mod_gifts_module'] ) ) {
			foreach( $this->request->post['mod_gifts_module'] as $key => $value) {
				if( ! $value['image_width'] || ! $value['image_height'] ) {
					$this->error['image_size'][$key] = $this->language->get('error_image_size');
				}
			}
		}
		
		if( empty( $this->request->post['mod_gifts_image_width'] ) || empty( $this->request->post['mod_gifts_image_width'] ) ) {
			$this->error['image_size_layout'] = $this->language->get('error_image_size');
		}
		
		return $this->__validate();
	}
	
	private function __validate() {		
		if( $this->error && ! isset( $this->error['warning'] ) )
			$this->error['warning'] = $this->language->get('error_warning');
		
		return $this->error ? false : true;
	}
}
?>