<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Controller extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		$this->load->model('App_write_model');
		$this->load->model('Gala_read_model');
	}

	protected function require_permission($key)
	{
		if (!$this->is_authenticated())
		{
			$continue = current_url();
			if ($this->input->server('QUERY_STRING'))
			{
				$continue .= '?'.$this->input->server('QUERY_STRING');
			}
			redirect('login?continue='.rawurlencode($continue));
		}

		$this->ensure_active_authenticated_user();

		if (!$this->has_permission($key))
		{
			show_error('No tienes acceso a esta seccion de Visor.', 403, 'Acceso denegado');
		}
	}

	protected function require_permissions($keys)
	{
		foreach ((array) $keys as $key)
		{
			$this->require_permission($key);
		}
	}

	protected function has_permission($key)
	{
		$auth_user = $this->get_auth_user();
		if (!$auth_user)
		{
			return FALSE;
		}

		$app_user = $this->App_write_model->get_app_user((int) $auth_user['employee_id']);
		if ($app_user && !empty($app_user['is_admin']))
		{
			return TRUE;
		}

		$permissions = $this->App_write_model->get_app_user_permissions((int) $auth_user['employee_id']);
		$defaults = $this->get_default_permissions();
		if (array_key_exists($key, $permissions))
		{
			return !empty($permissions[$key]);
		}

		if (array_key_exists($key, $defaults))
		{
			return !empty($defaults[$key]);
		}

		foreach ($this->get_permission_fallback_chain($key) as $fallback_key)
		{
			if (array_key_exists($fallback_key, $permissions))
			{
				return !empty($permissions[$fallback_key]);
			}
			if (array_key_exists($fallback_key, $defaults))
			{
				return !empty($defaults[$fallback_key]);
			}
		}

		return FALSE;
	}

	protected function get_default_permissions()
	{
		return array(
			'dashboard.view' => TRUE,
			'notificar.view' => TRUE,
			'tareas.view' => TRUE,
			'ventas.view' => TRUE,
			'ventas.rank.view' => TRUE,
			'metas.view' => TRUE,
			'metas.report.view' => TRUE,
			'personalizar.view' => TRUE,
			'personalizar.visor.view' => TRUE,
			'personalizar.aplicacion.view' => TRUE,
			'configuracion.view' => FALSE,
			'configuracion.descuentos.view' => FALSE,
			'configuracion.grupos.view' => FALSE,
			'configuracion.metas.view' => FALSE,
			'configuracion.tareas.view' => FALSE,
			'configuracion.notificaciones.view' => FALSE,
			'configuracion.ventas.view' => FALSE,
			'configuracion.empleados.view' => FALSE,
		);
	}

	protected function get_permission_labels()
	{
		return array(
			'dashboard.view' => 'Puede ver Dashboard',
			'notificar.view' => 'Puede ver Notificar',
			'tareas.view' => 'Puede ver Tareas',
			'ventas.view' => 'Puede ver Ventas',
			'ventas.rank.view' => 'Ventas - Puede ver Posicion',
			'metas.view' => 'Puede ver Metas',
			'metas.report.view' => 'Metas - Puede ver boton Reporte',
			'personalizar.view' => 'Puede ver Personalizar',
			'personalizar.visor.view' => 'Personalizar - Visor',
			'personalizar.aplicacion.view' => 'Personalizar - Aplicacion',
			'configuracion.view' => 'Puede ver Configuracion',
			'configuracion.descuentos.view' => 'Configuracion - Descuentos',
			'configuracion.grupos.view' => 'Configuracion - Grupos',
			'configuracion.metas.view' => 'Configuracion - Metas',
			'configuracion.tareas.view' => 'Configuracion - Tareas',
			'configuracion.notificaciones.view' => 'Configuracion - Notificaciones',
			'configuracion.ventas.view' => 'Configuracion - Ventas',
			'configuracion.empleados.view' => 'Configuracion - Empleados',
		);
	}

	protected function get_permission_fallback_chain($key)
	{
		$fallbacks = array(
			'ventas.rank.view' => array('ventas.view'),
			'metas.report.view' => array('metas.view'),
			'personalizar.visor.view' => array('personalizar.view'),
			'personalizar.aplicacion.view' => array('personalizar.view'),
			'configuracion.descuentos.view' => array('configuracion.view'),
			'configuracion.grupos.view' => array('configuracion.view'),
			'configuracion.metas.view' => array('configuracion.view'),
			'configuracion.tareas.view' => array('configuracion.view'),
			'configuracion.notificaciones.view' => array('configuracion.view'),
			'configuracion.ventas.view' => array('configuracion.view'),
			'configuracion.empleados.view' => array('configuracion.view'),
		);

		return isset($fallbacks[$key]) ? $fallbacks[$key] : array();
	}

	protected function redirect_to_first_allowed_route()
	{
		$routes = array(
			'notificar.view' => 'notificar',
			'tareas.view' => 'tareas',
			'ventas.view' => 'ventas',
			'metas.view' => 'metas',
			'personalizar.view' => 'personalizar',
			'configuracion.view' => 'configuracion',
		);

		foreach ($routes as $permission => $route)
		{
			if ($this->has_permission($permission))
			{
				redirect($route);
			}
		}

		show_error('No tienes modulos habilitados en Visor.', 403, 'Acceso denegado');
	}

	protected function render($view, $data = array())
	{
		$auth_user = $this->get_auth_user();
		$employee_id = $auth_user ? (int) $auth_user['employee_id'] : 0;
		$data['view'] = $view;
		$data['auth_user'] = $auth_user;
		$data['allowed_modules'] = $auth_user ? $this->get_allowed_modules() : array();
		$data['app_name'] = $this->App_write_model->get_setting('app_name', 'Visor');
		$data['company_name'] = $this->get_company_name();
		$data['user_preferences'] = $this->App_write_model->get_user_preferences($employee_id);
		$data['completion_counters'] = $employee_id > 0 ? $this->App_write_model->get_completion_counters($employee_id) : array('tasks' => 0, 'goals' => 0);
		$this->load->view('layouts/main', $data);
	}

	protected function get_company_name()
	{
		return $this->Gala_read_model->get_company_name_for_visor(1);
	}

	protected function get_allowed_modules()
	{
		$items = array(
			'dashboard' => array('label' => 'Dashboard', 'route' => 'dashboard', 'permission' => 'dashboard.view', 'icon' => 'ion-speedometer'),
			'notificar' => array('label' => 'Notificar', 'route' => 'notificar', 'permission' => 'notificar.view', 'icon' => 'ion-android-notifications'),
			'tareas' => array('label' => 'Tareas', 'route' => 'tareas', 'permission' => 'tareas.view', 'icon' => 'ion-checkmark-circled'),
			'ventas' => array('label' => 'Ventas', 'route' => 'ventas', 'permission' => 'ventas.view', 'icon' => 'ion-cash'),
			'metas' => array('label' => 'Metas', 'route' => 'metas', 'permission' => 'metas.view', 'icon' => 'ion-stats-bars'),
			'personalizar' => array('label' => 'Personalizar', 'route' => 'personalizar', 'permission' => 'personalizar.view', 'icon' => 'ion-gear-a'),
			'configuracion' => array('label' => 'Configuracion', 'route' => 'configuracion', 'permission' => 'configuracion.view', 'icon' => 'ion-settings'),
		);

		$allowed = array();
		foreach ($items as $key => $item)
		{
			if ($this->has_permission($item['permission']) && $this->is_module_available($key))
			{
				$allowed[$key] = $item;
			}
		}

		return $allowed;
	}

	protected function is_module_available($module_key)
	{
		if ($module_key === 'personalizar')
		{
			return $this->has_permission('personalizar.visor.view')
				|| $this->has_permission('personalizar.aplicacion.view');
		}

		if ($module_key === 'configuracion')
		{
			return $this->has_permission('configuracion.descuentos.view')
				|| $this->has_permission('configuracion.grupos.view')
				|| $this->has_permission('configuracion.metas.view')
				|| $this->has_permission('configuracion.tareas.view')
				|| $this->has_permission('configuracion.notificaciones.view')
				|| $this->has_permission('configuracion.ventas.view')
				|| $this->has_permission('configuracion.empleados.view');
		}

		return TRUE;
	}

	protected function is_authenticated()
	{
		$user = $this->session->userdata('visor_auth');
		return is_array($user) && !empty($user['employee_id']);
	}

	protected function get_auth_user()
	{
		$user = $this->session->userdata('visor_auth');
		return is_array($user) ? $user : null;
	}

	protected function ensure_active_authenticated_user()
	{
		$auth_user = $this->get_auth_user();
		if (!$auth_user)
		{
			return;
		}

		if (!$this->App_write_model->can_app_user_login((int) $auth_user['employee_id']))
		{
			$this->session->unset_userdata('visor_auth');
			$this->session->sess_destroy();
			redirect('login');
		}
	}
}
