<?php
session_start();
require_once '../include/bd_pdo.php';
require_once '../classes/Archivos.php';
require_once '../classes/EventoInsignia.php';
require_once '../classes/Fechas.php';

if(!isset($_POST['tipo'])){
    $return['error'] = 'Error! No se recibieron los datos.';
} else{
    date_default_timezone_set('America/Mexico_City');
    switch($_POST['tipo']){
        case 1: //SELECT ALL
            $_POST['year'] = intval(filter_var($_POST['year'], FILTER_SANITIZE_NUMBER_INT));
            $_POST['month'] = intval(filter_var($_POST['month'], FILTER_SANITIZE_NUMBER_INT));
            //if (($_POST['year'] . '-' . Fechas::dosDigitos($_POST['month'])) < '2023-04'){
            if (($_POST['year'] . '-' . Fechas::dosDigitos($_POST['month'])) < date('Y-m')){
               $eventos = array();
               $fechaIni = $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']) . '-01';
               $fechaFin = $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']) . '-' .cal_days_in_month(CAL_GREGORIAN, Fechas::dosDigitos($_POST['month']), $_POST['year']);
               $registros = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], null, $fechaIni, $fechaFin);
               if (count($registros) > 0){
                   $insignias = array_column($registros, 'insignia_id');
                   $eventos = EventoInsignia::getDatosEventos($pdo, $_POST['month'], $_POST['year']);
                   $eventos = depuraEventosAnteriores($eventos, $insignias);
               }
                if (count($eventos) == 0) {
                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
                        <img src="img/triangulos.svg" class="imgBoxIzq" />
                        <img src="img/triangulos.svg" class="imgBoxDer" />
                        <hr class="hrArriba">
                        <hr class="hrAbajo">
                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
                            <div><span class="text-azul1 mx-1">NO</span>participaste en ningún evento de éste mes</div>
                        </div>
                    </div>';
                } else {
                    $html = '';
                    if (count($eventos) > 1) {
                        reset($eventos);
                        while ($evento = current($eventos)) {
                            $index = key($eventos);
                            $fechas = EventoInsignia::getFechasRomanizadas($evento['fechas'], $evento['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
                            $eventos[$index]['texto'] = $fechas['texto'];
                            $eventos[$index]['horario'] = $fechas['horario'];
                            $eventos[$index]['horarioTemp'] = $fechas['horarioTemp'];
                            next($eventos);
                        }
                        usort($eventos, function($a, $b) {
                            $retval = $a['dia'] <=> $b['dia'];
                            if ($retval == 0) {
                                $retval = $a['horarioTemp'] <=> $b['horarioTemp'];
                            }
                            return $retval;
                        });
                    } else {
                        $fechas = EventoInsignia::getFechasRomanizadas($eventos[0]['fechas'], $eventos[0]['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
                        $eventos[0]['texto'] = $fechas['texto'];
                        $eventos[0]['horario'] = $fechas['horario'];
                        $eventos[0]['horarioTemp'] = $fechas['horarioTemp'];
                    }
                    foreach($eventos as $evento){
                        $insignia = EventoInsignia::getDatosInsignia($pdo, $evento['evento_id']);
                        $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $evento['insignia_id']);
                        if (count($registro) == 1) {
                            $registro = $registro[0];
                            $botones = getEstatus($registro);
                            $html .= generaEvento($evento['insignia_id'], $evento['titulo'], $insignia['InsigniaTipo_desc'], $insignia['InsigniaTipo_color'], $evento['texto'], $evento['dia'], $fechas['horario'], $botones);
                        }
                    }
                    if (!empty($html))
                        $return['html'] = '<div class="mt-4">' . $html . '</div>';
                    else
                        $return['error'] = 'No fue posible generar los eventos';
                }
            } else {
                $eventos = EventoInsignia::getDatosEventos($pdo, $_POST['month'], $_POST['year']);
                if (count($eventos) == 0){
                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
                        <img src="img/triangulos.svg" class="imgBoxIzq" />
                        <img src="img/triangulos.svg" class="imgBoxDer" />
                        <hr class="hrArriba">
                        <hr class="hrAbajo">
                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
                            <div>Aún<span class="text-azul1 mx-1">NO</span>hay eventos programados</div>
                        </div>
                    </div>';
                } else {
                    $html = '';
                    if (count($eventos) > 1) {
                        while ($evento = current($eventos)) {
                            $index = key($eventos);
                            $fechas = EventoInsignia::getFechasRomanizadas($evento['fechas'], $evento['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
                            $eventos[$index]['texto'] = $fechas['texto'];
                            $eventos[$index]['horario'] = $fechas['horario'];
                            $eventos[$index]['horarioTemp'] = $fechas['horarioTemp'];
                            next($eventos);
                        }
                        usort($eventos, function($a, $b) {
                            $retval = $a['dia'] <=> $b['dia'];
                            if ($retval == 0) {
                                $retval = $a['horarioTemp'] <=> $b['horarioTemp'];
                            }
                            return $retval;
                        });
                    } else {
                        $fechas = EventoInsignia::getFechasRomanizadas($eventos[0]['fechas'], $eventos[0]['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
                        $eventos[0]['texto'] = $fechas['texto'];
                        $eventos[0]['horario'] = $fechas['horario'];
                        $eventos[0]['horarioTemp'] = $fechas['horarioTemp'];
                    }
                    foreach($eventos as $evento){
                        $insignia = EventoInsignia::getDatosInsignia($pdo, $evento['evento_id']);
                        $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $evento['insignia_id']);
                        if (count($registro) == 1)
                            $registro = $registro[0];
                        $botones = getBotones($insignia, $evento, $registro);
                        $html .= generaEvento($evento['insignia_id'], $evento['titulo'], $insignia['InsigniaTipo_desc'], $insignia['InsigniaTipo_color'], $evento['texto'], $evento['dia'], $evento['horario'], $botones, $evento['detalle']);
                    }
                    if (!empty($html))
                        $return['html'] = '<div class="mt-4">' . $html . '</div>';
                    else
                        $return['error'] = 'No fue posible generar los eventos';
                }
            }
            break;
        case 2://Inscripcion a evento
            $_POST['insignia'] = filter_var($_POST['insignia'], FILTER_SANITIZE_NUMBER_INT);
            $stmt = $pdo->prepare('SELECT * FROM alu_fi_inscripcionevento(:Insignia, :Usuario)');
            $stmt->bindParam(':Insignia', $_POST['insignia']);
            $stmt->bindParam(':Usuario',$_SESSION['usuario_id']);
            if(!$stmt->execute()){
                $return['error'] = 'No fue posible inscribirte al evento ';
                print_r($stmt->errorInfo());
            }else{
                $return['msg'] = '¡Felicidades!';
                $return['ok'] = 'Te has inscrio a ';
            }
            $stmt->closeCursor();
            $stmt = null;
            break;
        case 3://Desinscripcion de evento
            $_POST['insignia'] = filter_var($_POST['insignia'], FILTER_SANITIZE_NUMBER_INT);
            $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $_POST['insignia']);
            if(isset($registro[0]['evidencia']) && !is_null($registro[0]['evidencia']))
                $ejecuta = Archivos::eliminaArchivo('archivos/eventos/' . $_POST['shortname'] . '/' . $_POST['insignia'], $registro[0]['evidencia']);
            else
                $ejecuta = true;
            if ($ejecuta){                            
                $stmt = $pdo->prepare('SELECT * FROM alu_fd_inscripcionevento(:Insignia, :Usuario)');
                $stmt->bindParam(':Insignia', $_POST['insignia']);
                $stmt->bindParam(':Usuario', $_SESSION['usuario_id']);
                if(!$stmt->execute()){
                    $return['error'] = 'No fue posible desinscribirte del evento ';
                    print_r($stmt->errorInfo());
                }else{
                    $evidencia = $stmt->fetch();              
                    $return['msg'] = '¡Que triste!';
                    $return['ok'] = 'Te has desinscrio de ';
                }
                $stmt->closeCursor();
                $stmt = null;
            } else 
                $return['error'] = 'No fue posible eliminar tu evidencia para desinscribirte del evento ';
            break;
        case 4://subir archivos
            $ruta = 'archivos/eventos/'.$_POST['shortname'];
            $carpeta = Archivos::existeCapeta($ruta);
            if(!$carpeta)//busca carpeta y la crea si no existe
                $carpeta = Archivos::creaCarpeta($ruta);
            if($carpeta) {
                $ruta .= '/'.$_POST['insignia'];
                $carpeta = Archivos::existeCapeta($ruta);//busca carpeta y la crea si no existe
                if(!$carpeta) //busca carpeta y la crea si no existe
                    $carpeta = Archivos::creaCarpeta($ruta);
                if($carpeta) {//si existe o se creo la carpeta
                    $nombre = "evidencia_" . $_SESSION['usuario_id'] . "_" . uniqid() . substr($_FILES['archivo']['name'][0], strrpos($_FILES['archivo']['name'][0], '.'));
                    if(Archivos::agregaArchivo($_FILES['archivo']['tmp_name'][0], $ruta, $nombre)) {                    
                        $stmt = $pdo->prepare('SELECT * FROM alu_fu_insigniaevidencia(:Insignia, :Usuario, :Evidencia)');
                        $stmt->bindParam(':Insignia', $_POST['insignia']);
                        $stmt->bindParam(':Usuario', $_SESSION['usuario_id']);
                        $stmt->bindParam(':Evidencia', $nombre);
                        if(!$stmt->execute()){
                            $return['error'] = 'No fue posible subir el archivo';
                            print_r($stmt->errorInfo());
                            Archivos::eliminaArchivo($ruta, $nombre);
                        }else{
                            $return['ok'] = 'El archivo se subió correctamente';
                        }
                        $stmt->closeCursor();
                        $stmt = null;
                    } else
                        $return['error'] = 'No fue posible cargar el archivo';
                } else
                    $return['error'] = 'No fue posible acceder a la carpeta del evento';
            } else
                $return['error'] = 'No fue posible acceder a la carpeta principal';
            break;
    }
}
$return['json'] = json_encode($return);
echo json_encode($return);

function depuraEventosAnteriores($eventos, $insignias){
    //$eliminar = array();
    while ($evento = current($eventos)) {
       if (!in_array($evento['insignia_id'],$insignias)) {
           $index = key($eventos);
           unset($eventos[$index]);
        }
        next($eventos);
    }
    return $eventos;
}

function generaEvento($insignia_id, $titulo, $tipo, $color, $fechas, $dia, $horario, $botones, $detalle = null){
    $html = '<div>
        <div class="d-flex flex-row justify-content-start align-items-stretch evento">
            <div class="calendario d-flex flex-column justify-content-between align-items-center" style="border-top-color:' . $color . ';">
                <h1>' . $dia . '</h1>
                <span>' . $horario . '</span>
            </div>
            <div id="evento_' . $insignia_id . '" class="ml-0 ml-sm-4 flex-grow-1 d-flex flex-column justify-content-start align-items-start">
                <div class="tituloEvento"><span class="mr-1 indivisa-text-bold">' . $tipo . ':</span><span>' . $titulo . '<span>';
    if (!is_null($detalle))
        $html .= '<span class="fa-solid fa-circle-info ml-1"  data-toggle="collapse" data-target="#detalle_' . $insignia_id . '" aria-expanded="true" aria-controls="detalle_' . $insignia_id . '"></span>';
    $html .= '</div>
                <div class="indivisa-text-italic">' . $fechas. '</div>
            </div>
            <div class="botones d-flex flex-column justify-content-around align-items-center">' . $botones . '</div>
        </div>';
    if (!is_null($detalle))
        $html .= '<div class="collapse" id="detalle_' . $insignia_id . '" data-parent="#eventos"><div class="p-3"><h6>Detalles del Evento</h6>' . $detalle . '</div></div>';
    $html .= '</div>';
    return $html;
}

function getEstatus($registro){
    $html = '';
    switch (strtoupper($registro['estado'])){
        case 'INSCRITO': $html .= '<div class="text-azul2 btn p-1"><i class="fa-regular fa-pen-to-square mr-1"></i>Inscrito al evento</div>'; break;
        case 'RECHAZADO': $html .= '<div class="text-danger btn p-1"><i class="ing-cancelar mr-1"></i>Insignia/Inscripción Rechazada</div>'; break;
        case 'AUTORIZADO': $html .= '<div class="text-success btn p-1"><i class="ing-aceptar mr-1"></i>Insignia/Inscripción Autorizada</div>'; break;
        case 'COMPLETADO': $html .= '<div class="text-azul1 btn p-1"><i class="ing-insignia4 mr-1"></i>Insignia Asignada</div>'; break;
    }
    if (!is_null($registro['comentario']))
        $html .= '<div class="text-secondary">' . $registro['comentarios'] . '</div>';
    return $html;
}

function getBotones($insignia, $evento, $registro){
    $html = '';
    $hoy = strtotime(date('Y-m-d h:i:s'));
    if(!isset($registro['estado'])) {//si el alumno no esta inscrito
        if (!is_null($insignia['InsigniaGeneral_inscripciones_inicial'])){
            if ($hoy >= strtotime($insignia['InsigniaGeneral_inscripciones_inicial']) && $hoy <= strtotime($insignia['InsigniaGeneral_inscripciones_final'])){
                $html .= '<button class="btn btn-verde btn-inscribir p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-tipo="1" data-toggle="modal" data-target="#modalConfirmar">
                        <span class="ing-reporte-resultados mr-1"></span>Inscribirme
                    </button>';
            } else {
                if ($hoy < strtotime($insignia['InsigniaGeneral_inscripciones_inicial'])) {
                    $html .= '<label class="txtLabel text-azul1 btn p-1"><span class="fa-regular fa-face-grin-beam-sweat text-azul1 mr-1"></span><span>El período de registro aún no se ha abierto</span></label>';
                } else {
                    $html .= '<label class="txtLabel btn p-1"><span class="fa-regular fa-face-frown text-danger mr-1"></span><span>El período de registro ha terminado</span></label></div>';
                }
            }
        } else {
            $html .= '<label class="txtLabel btn p-1"><span class="ing-importante text-warning mr-1"></span><span class="text-primary">Ver detalle para registro</span></label>';
        }
    } else {//si esta inscrito
        $html .= '<button class="btn btn-rojo btn-desinscribir p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-shortname="'. $evento['shortname'] .'" data-tipo="2" data-toggle="modal" data-target="#modalConfirmar">
                <span class="ing-cancelar mr-1"></span>Desinscribirme
            </button>';
    }
    if(isset($registro['estado']) && $insignia['Insignia_hasEvidencia']) {
        if (!$registro['evidencia']) {//si el evento necesita evidencia y no se ha subido
            if (is_null($insignia['Insignia_evidencia_desc']))
                $insignia['Insignia_evidencia_desc'] = '';
            $html .= '<button class="btn btn-azul1 addEvidencia p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-shortname="' . $evento['shortname'] .'" data-toggle="modal" data-target="#modalSubirArchivo">
                    <input type="hidden" value="' . $insignia['Insignia_evidencia_desc'] . '">
                    <span class="ing-carga-archivo"></span> Subir Evidencia
                </button>';
        } else {
            $html .= '<a class="btn btn-azul2 p-1" href="./archivos/eventos/'. $evento['shortname']. '/' .$evento['insignia_id']. '/' . $registro['evidencia'] .'" target="_blank">
                    <span class="ing-ver"></span> Ver Evidencia Cargada
                </a>';
        }
    }
    return $html;
}