<?php

class FirmaController extends Controller{

	public $layout='panel';

	/**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		return array(
			array(
				'allow',  // allow all users to perform 'index' and 'view' actions
				'actions' => array('index', 'view', 'obtenerDatos', 'agregar', 'modificar', 'eliminar' ,'subirFirma'),
				'users' => array('@'),
			),
			array(
			'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/*** Muestra todas las monedas ***/
	public function actionIndex(){
		$this->render('index');
	}

	/****	Muestra los datos de la Moneda	***/
	public function actionView($id){
		$model = $this->loadModel($id);

		$model->firm_inicio_periodo  = FuncionesController::convertirFecha($model->firm_inicio_periodo, "dd/mm/yyyy");
		$model->firm_fin_periodo  = FuncionesController::convertirFecha($model->firm_fin_periodo, "dd/mm/yyyy");

		$this->render('view',array('model' => $model));
	}

	// public function actionSubirFirma(){
	// 	$model = new SidcaiFirmaPresidente;
	// 	if(isset($_POST['ajax']) && $_POST['ajax']==='subir-firma-form'){
	// 		echo CActiveForm::validate($model);
	// 		Yii::app()->end();
	// 	}


	// 	if(isset($_POST['SidcaiFirmaPresidente'])){
	// 		$model->attributes = $_POST['SidcaiFirmaPresidente'];
	// 		$model->firm_ruta = 'firmas/';

	// 		$extPermitidas = array('jpeg', 'png'); // Extensiones permitidas a subir
	// 		$tamanoMaximo = 3; // Expresado en MB
		
	// 		if($model->validate()){
	// 			$archivo = CUploadedFile::getInstance($model, 'imagen');

	// 			if($archivo != null){				
	// 				if(in_array($archivo->extensionName, $extPermitidas)){
	// 					$tamMaximo = 1024 * 1024 * $tamanoMaximo;

	// 					if($archivo->size <= $tamMaximo){
	// 						Yii::import('application.controllers.FuncionesController');

	// 						$codigo = FuncionesController::generarCodigo(7, 3);

	// 						$nombre_archivo = $model->firm_ruta.$codigo."-".$archivo->name;

	// 						$model->firm_ruta = $nombre_archivo;

	// 				 		if($model->save()){
	// 				 			$ruta = Yii::getPAthOfAlias('webroot').'/images/';

	// 						 	$archivo->saveAs($ruta.'/'.$nombre_archivo);
	// 							echo "1";
	// 						}else{
	// 							echo "No se logró subir la firma.";
	// 						}
	// 					}else{
	// 						echo "El tamaño máximo permitido es " .$tamanoMaximo. "mb.";
	// 					}
	// 				}else{
	// 					echo "La extensión no es válida.";
	// 				}
	// 			}else{
	// 				echo "No ha seleccionado un archivo.";
	// 			}
	// 		}
	// 	}
	// }

	/***	Agregar Firma	***/
	public function actionAgregar(){
		$model = new SidcaiFirmaPresidente;

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiFirmaPresidente'])){
			$model->attributes = $_POST['SidcaiFirmaPresidente'];

			$extPermitidas = ['jpg', 'jpeg']; // Extensiones permitidas a subir
			$imagen_firma = CUploadedFile::getInstance($model, 'imagen');
			$ruta = Yii::getPAthOfAlias('webroot').'/images/firmas';

			$data = $this->subirFirma($model, $imagen_firma, 2, $ruta, $extPermitidas);

			Yii::app()->user->setFlash($data[0], $data[1]);

			$this->refresh();
		}

		$this->render('guardar', array('model' => $model));
	}

	/***	Modificar Firma	***/
	public function actionModificar($id){
		$model = $this->loadModel($id);

		$this->performAjaxValidation($model);

		if($model->firm_habilitado)
			$model->firm_habilitado = 1;
		else
			$model->firm_habilitado = 0;

		if(isset($_POST['SidcaiFirmaPresidente'])){
			$model->attributes = $_POST['SidcaiFirmaPresidente'];

			$extPermitidas = ['jpg', 'jpeg']; // Extensiones permitidas a subir
			$imagen_firma = CUploadedFile::getInstance($model, 'imagen');
			$ruta = Yii::getPAthOfAlias('webroot').'/images/firmas';

			$data = $this->modificarFirma($model, $imagen_firma, 2, $ruta, $extPermitidas);

			Yii::app()->user->setFlash($data[0], $data[1]);

			$this->refresh();
		}

		$model->firm_inicio_periodo  = FuncionesController::convertirFecha($model->firm_inicio_periodo, "dd/mm/yyyy");
		$model->firm_fin_periodo  = FuncionesController::convertirFecha($model->firm_fin_periodo, "dd/mm/yyyy");

		$this->render('guardar', array('model' => $model));

	}

	/***	Eliminar Moneda	***/
	public function actionEliminar($id){
		try{		
			$this->loadModel($id)->delete();
			Yii::app()->user->setState('success_eliminar', 'Se ha eliminado el registro correctamente.');
		}catch(CDbException $e){
			Yii::app()->user->setState('danger_eliminar', '<b>¡Ups!</b> Ha ocurrido un error y no se pudo eliminar, intente más tarde.<br><br><b>Mensaje de error:</b><br><br>'.$e->getMessage());
		}		

		$this->redirect(Yii::app()->baseUrl. "/admin/firma");
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todas las monedas.
	public function actionObtenerDatos(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$nTotal = SidcaiFirmaPresidente::model()->count();

		// Se importa el controlador para hacer uso de la funcion "convertirFecha".
		Yii::import('application.controllers.FuncionesController');

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'firm_codigo_pk', 
			'firm_ruta', 
			'firm_habilitado',
			'acciones'
		];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {


			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "firm_codigo_pk"; // ID de la tabla

					$consulta .= " CAST(".$columnasParaRetorno[$i]." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}


			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "firm_codigo_pk";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			$ordenado = "ORDER BY " .$ordenado;
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "SELECT * FROM sidcai_firma_presidente $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_firma_presidente $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$ver = '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'admin/firma/' .$m['firm_codigo_pk']. '"><i class="far fa-eye"></i></a>';
			$modificar = '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'admin/firma/modificar/' .$m['firm_codigo_pk']. '"><i class="fas fa-pen"></i></a>';
			$borrar = '<a class="btn-acciones text-danger p-2" title="Eliminar" href="" data-toggle="modal" data-target=".bd-example-modal-sm" onclick="eliminar(' .$m['firm_codigo_pk']. ')"><i class="fas fa-times"></i></a>';

			$aaData[] = [
				$m['firm_codigo_pk'],
				$m['firm_ruta'],	
				$m['firm_habilitado'] ? 'Habilitado' : 'Deshabilitado',
				$ver.$modificar.$borrar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/***************
	$model 			=> Modelo del archivo a subir
	$archivo 		=> CUploadedFile::getInstance($model, archivo_a_subir);
	$tamano 		=> Tamaño máximo en MB del archivo a subir
	$ruta 			=> Ruta donde se va a guardar el archivo a subir
	$extPermitidad 	=> Debe venir en un array donde esten las extesiones permitidas a subir
	****************/
	private function subirFirma($model, $archivo, $tamano, $ruta, $extPermitidas){
		if($archivo != null){
			if(in_array($archivo->extensionName, $extPermitidas)){
				$tamMaximo = 1024 * 1024 * $tamano; // $tamano -> valor en MB

				if($archivo->size <= $tamMaximo){
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));
					$hoy = $date->format('Y-m-d');

					$nombre_archivo = $hoy.uniqid('-').'.'.$archivo->extensionName;

			 		$model->firm_ruta = "images/firmas/".$nombre_archivo;

			 		$model->firm_inicio_periodo  = FuncionesController::convertirFecha($model->firm_inicio_periodo, "yyyy-mm-dd");
					$model->firm_fin_periodo  = FuncionesController::convertirFecha($model->firm_fin_periodo, "yyyy-mm-dd");

			 		if($model->validate()){			 			
				 		if($model->save()){
						 	$archivo->saveAs($ruta.'/'.$nombre_archivo);
							$model->unsetAttributes();

							return ['success', 'Se agregó la firma del presidente correctamente.'];
						}else{
							return ["error", "¡Ups! Hubo un error al guardar la firma."];
						}
			 		}else{
			 			return ["error", "¡Ups! Hay problemas con la validación."];
			 		}
				}else{
					return ["error", "El tamaño máximo permitido es " .$tamano. "mb."];
				}
			}else{
				return ["error", "El archivo no es válido."];
			}
		}else{
			return ["error", "No ha seleccionado un archivo."];
		}
	}

	/***************
	$model 			=> Modelo del archivo a subir
	$archivo 		=> CUploadedFile::getInstance($model, archivo_a_subir);
	$tamano 		=> Tamaño máximo en MB del archivo a subir
	$ruta 			=> Ruta donde se va a guardar el archivo a subir
	$extPermitidad 	=> Debe venir en un array donde esten las extesiones permitidas a subir
	****************/
	private function modificarFirma($model, $archivo, $tamano, $ruta, $extPermitidas){
		if($archivo == null){
			if($model->validate()){	
		 		if($model->save()){
					$model->unsetAttributes();

					return ['success', 'Se modificó la firma del presidente correctamente.'];
				}else{
					return ["error", "¡Ups! Hubo un error al guardar la firma."];
				}
	 		}else{
	 			return ["error", "¡Ups! Hay problemas con la validación."];
	 		}
		}else{
			if(in_array($archivo->extensionName, $extPermitidas)){
				$tamMaximo = 1024 * 1024 * $tamano; // $tamano -> valor en MB

				if($archivo->size <= $tamMaximo){
					$antigua_ruta = $model->firm_ruta;
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));

					$hoy = $date->format('Y-m-d');

					$nombre_archivo = $hoy.uniqid('-').'.'.$archivo->extensionName;

					$model->firm_ruta = "images/firmas/".$nombre_archivo;

					Yii::import('application.controllers.FuncionesController');

					$model->firm_inicio_periodo  = FuncionesController::convertirFecha($model->firm_inicio_periodo, "yyyy-mm-dd");
					$model->firm_fin_periodo  = FuncionesController::convertirFecha($model->firm_fin_periodo, "yyyy-mm-dd");

					$transaction = $model->dbConnection->beginTransaction();

					if($model->validate()){
						if($model->save()){
							if(unlink($antigua_ruta)){			 				
					 			$archivo->saveAs($ruta.'/'.$nombre_archivo);
								$model->unsetAttributes();
								$transaction->commit();
								return ['success', 'Se modificó la firma del presidente correctamente.'];
				 			}else{
				 				$transaction->rollBack();
				 				return ["error", "¡Ups! Hubo un error al eliminar la anterior firma."];
				 			}						 	
						}else{
							$transaction->rollBack();
							return ["error", "¡Ups! Hubo un error al guardar la firma."];
						}
					}else{
						$transaction->rollBack();
						return ["error", "¡Ups! Hay problemas con la validación."];
					}		
				}else{
					$transaction->rollBack();
					return ["error", "El tamaño máximo permitido es " .$tamano. "mb."];
				}
			}else{
				$transaction->rollBack();
				return ["error", "El archivo no es válido."];
			}
		}
	}

	/*********************************************************************************************

											Funciones

	*********************************************************************************************/
	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return SidcaiMoneda the loaded model
	 * @throws CHttpException
	 */
	public function loadModel(int $id){
		$model = SidcaiFirmaPresidente::model()->findByPk($id);
		
		if($model === null)
			throw new CHttpException(404,'La página no existe.');
		
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiMoneda $model the model to be validated
	 */
	protected function performAjaxValidation($model){
		if(isset($_POST['ajax']) && $_POST['ajax'] === 'firma-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}


	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/
}
