<?php

class CreditofiscalController 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', 'obtenerDatos', 'modificar', 'eliminar', 'agregar','eliminarmasivo'),
				'users' => array('@'),
			),
			array(
			'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/*** Muestra todas las monedas ***/
	public function actionIndex(){
		$this->render('index');
	}

	/****	Muestra los datos del Crédito Fiscal	***/
	/*public function actionView($id){
		$model = $this->loadModel($id);

		// Se importa el Controlador para usar la función "convertirFecha"
		Yii::import('application.controllers.FuncionesController');
		$model->mone_fechainicio = FuncionesController::convertirFecha($model->mone_fechainicio, 'dd/mm/yyy');
		$model->mone_fechafin 	 = FuncionesController::convertirFecha($model->mone_fechafin, 'dd/mm/yyyy');

		$this->render('view',array('model' => $model));
	}*/

	/***	Agregar Credito Fiscal	***/
	public function actionAgregar(){
		$model = new SidcaiCreditoFiscal;		
		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiCreditoFiscal'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $_POST['SidcaiCreditoFiscal'], "agregar");

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			$this->render('guardar', ['model' => $model]);
		}
	}

	/***	Modificar Credito Fiscal	***/
	public function actionModificar($id)
{
    $model = $this->loadModel($id);
    //$model->scenario = "modificar";

    $this->performAjaxValidation($model);

    if (isset($_POST['SidcaiCreditoFiscal'])) {

        /* ===========================
           NORMALIZAR cred_habilitado
        ============================ */
        if (array_key_exists('cred_habilitado', $_POST['SidcaiCreditoFiscal'])) {

            $valor = $_POST['SidcaiCreditoFiscal']['cred_habilitado'];

            $_POST['SidcaiCreditoFiscal']['cred_habilitado'] =
                ($valor === '1' || $valor === 1 || $valor === true || $valor === 'true') ? 1 : 0;
        }

        if (isset($_POST['ok'])) {
            $data = [];

            $data['datos'] = $this->guardar(
                $model,
                $_POST['SidcaiCreditoFiscal'],
                "modificar",
                $id
            );

            echo json_encode($data);
        }

        Yii::app()->end();

    } else {

        Yii::import('application.controllers.FuncionesController');

        $model->cred_fecha = FuncionesController::convertirFecha(
            $model->cred_fecha,
            'dd/mm/yyy',
            false
        );

        $model->cred_monto = number_format(
            $model->cred_monto,
            2,
            ',',
            '.'
        );

        // Normalizar para que el dropdown muestre correcto
        $model->cred_habilitado = ($model->cred_habilitado) ? '1' : '0';

        $this->render('guardar', [
            'model' => $model
        ]);
    }
}


	public function actionModificar2101($id){
		$model = $this->loadModel($id);
		//$model->scenario = "modificar";

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiCreditoFiscal'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $_POST['SidcaiCreditoFiscal'], "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->cred_fecha = FuncionesController::convertirFecha($model->cred_fecha, 'dd/mm/yyy', false);
			$model->cred_monto = number_format($model->cred_monto, 2, ',' ,'.');

			$this->render('guardar', array('model' => $model));
		}

	}

	/***	Eliminar Moneda	***/
	public function actionEliminar()
{
    $id = Yii::app()->request->getPost('id');

    if (!$id) {
        echo json_encode(['success' => false, 'message' => 'ID no recibido.']);
        Yii::app()->end();
    }

    $model = $this->loadModel($id);

    if ($model->delete()) {
        echo json_encode(['success' => true, 'message' => 'Eliminado correctamente.']);
    } else {
        echo json_encode(['success' => false, 'message' => 'No se pudo eliminar.']);
    }

    Yii::app()->end();
}

	// Action llamado por Ajax en "dataTable.js" para mostrar todas las monedas.
	public function actionObtenerDatos()
	{
		$nTotal = SidcaiCreditoFiscal::model()->count();
	
		Yii::import('application.controllers.FuncionesController');
	
		$datosDeLlamada = $_GET;
	
		// Validar y establecer valores por defecto para parámetros de DataTables
		$start = isset($datosDeLlamada['start']) ? intval($datosDeLlamada['start']) : 0;
		$length = isset($datosDeLlamada['length']) ? intval($datosDeLlamada['length']) : 10;
		
		// Si length es -1 (mostrar todos), establecer un límite alto
		if ($length == -1) {
			$length = $nTotal;
		}
	
		$columnasParaRetorno = [
			'cred_codigo_pk', 
			'apor_rif', 
			'decl_codigo_fk_origen',
			'decl_codigo_fk_destino',
			'cred_monto',
			'cred_fecha',
			'cred_habilitado'
		];
	
		$tablaAportante = ["apor_rif"];
	
		// Filtrado por búsqueda global
		/* 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] = "cred_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['order'][0]['column'])) {
			$colIndex = intval($datosDeLlamada['order'][0]['column']);
			// Validar que el índice esté dentro del rango
			if ($colIndex >= 0 && $colIndex < count($columnasParaRetorno)) {
				$dir = ($datosDeLlamada['order'][0]['dir'] === 'asc') ? 'ASC' : 'DESC';
				$col = $columnasParaRetorno[$colIndex];
				if (in_array($col, $tablaAportante)) {
					$col = "a.$col";
				} else {
					$col = "c.$col";
				}
				$ordenado = "ORDER BY $col $dir";
			}
		}
	
		// Si no hay ordenamiento, usar uno por defecto
		if (empty($ordenado)) {
			$ordenado = "ORDER BY c.cred_codigo_pk DESC";
		}
	
		$connection = Yii::app()->db;
	
		// Registros filtrados
		$sql = "SELECT c.*, a.apor_rif,a.apor_razonsocial
				FROM sidcai_credito_fiscal c
				INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = c.apor_codigo_fk
				$consulta 
				$ordenado
				OFFSET $start LIMIT $length"; 
		
		$command = $connection->createCommand($sql);
		$model = $command->queryAll();
	
		// Total filtrado
		$sqlTotalFiltro = "SELECT COUNT(*) FROM sidcai_credito_fiscal c
						   INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = c.apor_codigo_fk
						   $consulta";
		$totalFiltro = $connection->createCommand($sqlTotalFiltro)->queryScalar();
	
		$data = [];
		foreach($model as $m){
			$data[] = [
				// Columna 1: solo el checkbox
				'<input type="checkbox" class="chkSeleccionar" data-id="' . $m['cred_codigo_pk'] . '" value="' . $m['cred_codigo_pk'] . '">',
			
				// Columna 2: solo el ID
				$m['cred_codigo_pk'],
			
				// Resto de columnas
				'<span class="tooltip-rif" title="' . htmlspecialchars($m['apor_razonsocial']) . '">
					' . $m['apor_rif'] . '
					<i class="fas fa-info-circle ml-1"></i>
				</span>',


				$m['decl_codigo_fk_origen'],
				$m['decl_codigo_fk_destino'],
				FuncionesController::obtenerMoneda($m['cred_fecha']).' '.number_format($m['cred_monto'], 2, ',', '.'),
				FuncionesController::convertirFecha($m['cred_fecha'], "dd/mm/yyyy"),
				$m['cred_habilitado'] ? 'Sí' : 'No',
				'<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->createUrl('admin/creditofiscal/modificar', ['id' => $m['cred_codigo_pk']]).'"><i class="fas fa-pen"></i></a>' .
				'<a class="btn-acciones text-danger p-2" title="Eliminar" href="#" onclick="eliminarIndividual('.$m['cred_codigo_pk'].'); return false;"><i class="fas fa-times"></i></a>'

			];
			
		}
	
		header('Content-Type: application/json');
		echo json_encode([
			'draw' => isset($datosDeLlamada['draw']) ? intval($datosDeLlamada['draw']) : 0,
			'recordsTotal' => intval($nTotal),
			'recordsFiltered' => intval($totalFiltro),
			'data' => $data
		]);
		Yii::app()->end();
	}



	public function actionEliminarMasivo()
{
    if (Yii::app()->request->isPostRequest) {
        $ids = Yii::app()->request->getPost('ids', array());
        
        if (empty($ids)) {
            echo json_encode([
                'success' => false,
                'message' => 'No se recibieron IDs para eliminar.'
            ]);
            Yii::app()->end();
        }

        // Asegurarse de que los IDs sean números válidos
        $ids = array_filter($ids, function($id) {
            return is_numeric($id) && $id > 0;
        });

        if (empty($ids)) {
            echo json_encode([
                'success' => false,
                'message' => 'No se recibieron IDs válidos para eliminar.'
            ]);
            Yii::app()->end();
        }

        $transaction = Yii::app()->db->beginTransaction();
        try {
            $eliminados = 0;
            $errores = 0;
            $erroresDetalle = [];
            
            foreach ($ids as $id) {
                $model = SidcaiCreditoFiscal::model()->findByPk($id);
                
                if ($model !== null) {
                    if ($model->delete()) {
                        $eliminados++;
                    } else {
                        $errores++;
                        $erroresDetalle[] = "ID $id: " . implode(', ', $model->getErrors());
                    }
                } else {
                    $errores++;
                    $erroresDetalle[] = "ID $id: Registro no encontrado";
                }
            }
            
            $transaction->commit();
            
            $mensaje = "Se eliminaron {$eliminados} registros correctamente.";
            if ($errores > 0) {
                $mensaje .= " Hubo {$errores} errores.";
                if (YII_DEBUG) {
                    $mensaje .= " Detalles: " . implode('; ', $erroresDetalle);
                }
            }
            
            echo json_encode([
                'success' => true,
                'message' => $mensaje,
                'eliminados' => $eliminados,
                'errores' => $errores
            ]);
            
        } catch (Exception $e) {
            $transaction->rollback();
            Yii::log('Error en eliminación masiva: ' . $e->getMessage(), 'error');
            
            echo json_encode([
                'success' => false,
                'message' => 'Error al eliminar los registros: ' . $e->getMessage()
            ]);
        }
    } else {
        throw new CHttpException(400, 'Solicitud inválida.');
    }
    
    Yii::app()->end();
}

	/*********************************************************************************************

											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 = SidcaiCreditoFiscal::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'] === 'sidcai-credito-fiscal-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	/**
		* Función para guardar un registro tango en agregar como en modificar.
		* Función llamada en "actionAgregar" y en "actionModificar".
		* @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->cred_monto = str_replace(".", "", $model->cred_monto);
		$model->cred_monto = str_replace(",", ".", $model->cred_monto);

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiCreditoFiscal");
			return ["warning", $msj_error.$errores];
		}

		// Una vez validado el $model se proceden a validar los datos.

		// Se convierten las fechas al formato "yyyy-mm-dd" para que se puedan guardar en la BD.
		$model->cred_fecha = FuncionesController::convertirFecha($model->cred_fecha, "yyyy-mm-dd");
	
		if($accion == "agregar"){
			// Se guardan los datos
			if($model->save())
				$guardar = ["success", "Se agregó la Crédito Fiscal correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró agregar la Crédito Fiscal."];
		}else{
			// Se crea un nuevo model para guardar solo los campos que se pueden modificar.
			$model_guardar = $this->loadModel($id);
			//$model_guardar->scenario = "modificar";

			$model_guardar->apor_codigo_fk 				= $model->apor_codigo_fk;
			$model_guardar->decl_codigo_fk_origen 		= $model->decl_codigo_fk_origen;
			$model_guardar->decl_codigo_fk_destino 		= $model->decl_codigo_fk_destino;
			$model_guardar->cred_monto 					= $model->cred_monto;
			$model_guardar->cred_fecha 					= $model->cred_fecha;
			$model_guardar->cred_habilitado 			= $model->cred_habilitado;

			if($model_guardar->save())
				$guardar = ["success", "Se modificó el Crédito Fiscal correctamente.", $accion];
			else
				$guardar = ["danger", "No se logró modificar el Crédito Fiscal."];

			$model_guardar->unsetAttributes(); // Se limpia el model.
		}

		unset($_POST['SidcaiCreditoFiscal']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/*
	public function actionEliminarMasivo(){
		if(isset($_POST['ids']) && is_array($_POST['ids'])){
			$ids = $_POST['ids'];
			foreach($ids as $id){
				$model = CreditoFiscal::model()->findByPk($id);
				if($model) $model->delete();
			}
	
			echo json_encode(['success'=>true, 'message'=>'Registros eliminados correctamente.']);
			Yii::app()->end();
		}
	
		echo json_encode(['success'=>false, 'message'=>'No se recibieron registros.']);
	}*/
	
	

	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/
}
