<?php

class CertificadoController extends Controller{
	// Layout
	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 authenticated user to perform 'create' and 'update' actions
				'actions'=>array('index', 'error', 'modificar', 'view', 'agregar_error','modificar_error', 'eliminar', 'obtenerDatos', 'obtenerDatosError'),
				'users'=>array('@'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/***	Listado de todos los Certificados	***/
	public function actionView($id){
		$this->render('view', ['model' => $this->loadModel($id)]);
	}

	/***	Modificar Certificado	***/
	public function actionModificar($id){
		$model = $this->loadModel($id);
		$model->scenario = "modificar";

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiCertificado'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $_POST['SidcaiCertificado'], "modificar", $id);

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			// Se importa el Controlador para usar la función "convertirFecha"
			Yii::import('application.controllers.FuncionesController');

			$model->cert_fecha_emitida = FuncionesController::convertirFecha($model->cert_fecha_emitida, 'dd/mm/yyy');
			$model->cert_habilitado = ($model->cert_habilitado) ? 1 : 0;

			$this->render('guardar', array('model' => $model));
		}

	}

	/***	Agregar Error de Certificado	***/
	public function actionAgregar_error(){
		$model=new SidcaiCertificadoError;

		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-certificado-error-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiCertificadoError'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar_error($model, $_POST['SidcaiCertificadoError'], "agregar");

				echo json_encode($data);
			}
			Yii::app()->end();
		}else
			$this->render('guardar_error', array('model' => $model));
	}

	/***	Modificar Error de Certificado	***/
	public function actionModificar_error($id){
		$model = SidcaiCertificadoError::model()->findByPk($id);

		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-certificado-error-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiCertificadoError'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar_error($model, $_POST['SidcaiCertificadoError'], "modificar", $id);

				echo json_encode($data);
			}
			Yii::app()->end();
		}else
			$this->render('guardar_error', array('model' => $model));
	}

	/**
		* Función para guardar un registro tango en agregar como en modificar CErtificado ERROR.
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardar_error($model, array $post, string $accion, int $id = null) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel" y "convertirFecha".
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}

		$model->attributes = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiCertificadoError");
			return ["warning", $msj_error.$errores];
		}


		if($accion == "agregar"){
			// Se guardan los datos
			if($model->save())
				$guardar = ["success", "Se agregó el Error del Certificado correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró agregar el Error del Certificado."];
		}else{
			// Se crea un nuevo model para guardar solo los campos que se pueden modificar.
			$model_guardar = SidcaiCertificadoError::model()->findByPk($id);
			$model_guardar->cert_erro_descripcion 	= $model->cert_erro_descripcion;
			$model_guardar->cert_habilitado 		= $model->cert_habilitado;

			if($model_guardar->save())
				$guardar = ["success", "Se modificó el Error del Certificado correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró modificar el Error del Certificado."];

			$model_guardar->unsetAttributes(); // Se limpia el model.
		}

		unset($_POST['SidcaiCertificadoError']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/**
		* Función para guardar un registro tango en agregar como en modificar Certificado.
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardar($model, array $post, string $accion, int $id = null) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel" y "convertirFecha".
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}

		$model->attributes = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		$model->cert_fecha_emitida = FuncionesController::convertirFecha($model->cert_fecha_emitida, 'yyyy-mm-dd');

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiCertificado");
			return ["warning", $msj_error.$errores];
		}


		if($accion == "agregar"){
			// Se guardan los datos
			if($model->save())
				$guardar = ["success", "Se agregó el Certificado correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró agregar el Certificado."];
		}else{
			// Se crea un nuevo model para guardar solo los campos que se pueden modificar.
			$model_guardar = SidcaiCertificado::model()->findByPk($id);
			$model_guardar->firm_codigo_fk 		= $model->firm_codigo_fk;
			$model_guardar->cert_codigo_unico 	= $model->cert_codigo_unico;
			$model_guardar->cert_habilitado 	= $model->cert_habilitado;
			$model_guardar->cert_fecha_emitida 	= $model->cert_fecha_emitida;
			$model_guardar->cert_erro_fk 		= $model->cert_erro_fk;
			$model_guardar->apor_codigo_fk 		= $model->apor_codigo_fk;
			$model_guardar->audit_usua 			= Yii::app()->user->id;

			if($model_guardar->save())
				$guardar = ["success", "Se modificó el Certificado correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró modificar el Certificado."];

			$model_guardar->unsetAttributes(); // Se limpia el model.
		}

		unset($_POST['SidcaiCertificado']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'admin' page.
	 * @param integer $id the ID of the model to be deleted
	 */
	public function actionDelete($id)
	{
		$this->loadModel($id)->delete();

		// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
		if(!isset($_GET['ajax']))
			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
	}

	/*** Muestra todos los Certificados ***/
	public function actionIndex(){
		$this->render('index');
	}

	/*** Muestra todas los Erers de Certificados ***/
	public function actionError(){
		$this->render('index-error');
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todos los Certificados.
	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 = SidcaiCertificado::model()->count();

		// 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 = [
			'cert_codigo_pk', 
			'apor_codigo_fk',
			'decl_codigo_fk',
			'firm_codigo_fk',
			'cert_fecha_emitida',
			'cert_codigo_unico',
			'cert_habilitado',
			'acciones'
		];

		$datosDeLlamada = $_GET;

		$tablaAportante = ['apor_rif'];

		/* 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] = "cert_codigo_pk"; // ID de la tabla

					$col = "c.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					$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])] = "esta_codigo_pk";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaAportante))
				$ordenado = "ORDER BY a." . $ordenado;
			else
				$ordenado = " ORDER BY c." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "SELECT c.*, a.apor_codigo_pk, a.apor_rif FROM sidcai_certificado c INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = c.apor_codigo_fk $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_certificado c INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = c.apor_codigo_fk $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" target="_blank" href="'.Yii::app()->homeUrl.'certificado/certificadoPDF/' .$m['decl_codigo_fk']. '"><i class="far fa-eye"></i></a>';
			$modificar = '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'admin/certificado/modificar/' .$m['cert_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['cert_codigo_pk']. ')"><i class="fas fa-times"></i></a>';

			$aaData[] = [
				$m['cert_codigo_pk'],
				$m['apor_rif'],
				$m['decl_codigo_fk'],
				$m['firm_codigo_fk'],
				FuncionesController::convertirFecha($m['cert_fecha_emitida'], 'dd/mm/yyyy'),
				$m['cert_codigo_unico'],
				$m['cert_habilitado'],
				$ver.$modificar.$borrar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}


	// Action llamado por Ajax en "dataTable.js" para mostrar todos los errores de  Certificados.
	public function actionObtenerDatosError(){
		// 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 = SidcaiCertificadoError::model()->count();

		// 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 = [
			'cert_erro_pk', 
			'cert_erro_descripcion',
			'cert_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] = "cert_erro_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])] = "cert_erro_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_certificado_error $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_certificado_error $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$modificar = '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'admin/certificado/modificar_error/' .$m['cert_erro_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['cert_erro_pk']. ')"><i class="fas fa-times"></i></a>';

			$aaData[] = [
				$m['cert_erro_pk'],
				$m['cert_erro_descripcion'],
				$m['cert_habilitado'],
				$modificar.$borrar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/**
	 * 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 SidcaiCertificado the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=SidcaiCertificado::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiCertificado $model the model to be validated
	 */
	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-certificado-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}
}
