<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\CLIRequest;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

use Psr\Log\LoggerInterface;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *     class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 */

class BaseController extends Controller
{
	/**
	 * Instance of the main Request object.
	 *
	 * @var IncomingRequest|CLIRequest
	 */
	protected $request;

	/**
	 * Instance of validation object
	 *
	 * @var \CodeIgniter\Validation\Validation
	 */
	protected $validation;

	/**
	 * Instance of session object
	 *
	 * @var \CodeIgniter\Session\Session
	 */	
	protected $session;

	/**
	 * Instance of negotiator object
	 *
	 * @var \CodeIgniter\HTTP\Negotiate
	 */
	protected $negotiate;

	/**
	 * An array of helpers to be loaded automatically upon
	 * class instantiation. These helpers will be available
	 * to all other controllers that extend BaseController.
	 *
	 * @var array
	 */
	protected $helpers = ['array', 'cookie', 'date', 'filesystem', 'form', 'html', 'inflector', 'number', 'security', 'text', 'directory', 'agent', 'account', 'mail', 'adminalert'];

	/**
	 * Constructor.
	 *
	 * @param RequestInterface  $request
	 * @param ResponseInterface $response
	 * @param LoggerInterface   $logger
	 */
	public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
	{
		// Do Not Edit This Line
		parent::initController($request, $response, $logger);

		//--------------------------------------------------------------------
		// Preload any models, libraries, etc, here.
		//--------------------------------------------------------------------
		// E.g.: $this->session = \Config\Services::session();

		$this->request = \Config\Services::request();
		$this->validation =  \Config\Services::validation();
		$this->session = \Config\Services::session();
		$this->negotiate = \Config\Services::negotiator();
		$language = \Config\Services::language();
		$defaultLocale = config('App')->defaultLocale ?? 'en';
		$sessionLang = $this->session->get('lang');
		$locale = is_string($sessionLang) ? trim(str_replace(['..', '/', '\\'], '', $sessionLang)) : '';
		if ($locale === '') {
			$locale = $defaultLocale;
		}
		$localizePath = rtrim(APPPATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'Language' . DIRECTORY_SEPARATOR . $locale . DIRECTORY_SEPARATOR . 'Localize.php';
		if (! is_file($localizePath)) {
			$locale = $defaultLocale;
			$localizePath = rtrim(APPPATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'Language' . DIRECTORY_SEPARATOR . $locale . DIRECTORY_SEPARATOR . 'Localize.php';
			if (! is_file($localizePath) && $locale !== 'en') {
				$locale = 'en';
			}
		}
		$language->setLocale($locale);

		// Egypt (Africa/Cairo) for PHP date() / strtotime and MySQL session (DST from IANA tzdata).
		ensure_egypt_php_timezone();
		sync_mysql_egypt_timezone();
	}
}
