<?php
/*
idPeriodo: identificador del periodo a consultar (obligatorio, número entero)
claveFacultad: clave de la facultad a consultar (opcional, cadena)
claveCarrera: clave de la carrera a consultar (opcional, cadena)
claveProfesor: clave del empleado a consultar (opcional, cadena)
fecha: fecha de la clase (opcional, cadena en formato yyyy-MM-dd)
 */
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('post_max_size', 1);
ini_set('max_execution_time', 8*60);
error_reporting(E_ALL);
date_default_timezone_set('America/Mexico_City');

$ruta = "../";
$ruta_superior = dirname(__DIR__);
require_once $ruta_superior."/include/bd_pdo_rest.php";
require_once __DIR__."/token.php";
require_once __DIR__."/LogCambios.php";

function quitaAcentos($cadena) {
    // Normalizar la cadena para descomponer caracteres acentuados en sus formas base y acentos
    $cadenaNormalizada = Normalizer::normalize($cadena, Normalizer::FORM_D);
    // Utilizar una expresión regular para eliminar los caracteres diacríticos
    $cadenaSinAcentos = preg_replace('/\p{M}/u', '', $cadenaNormalizada);
    return $cadenaSinAcentos;
}

//--------------ACTUALIZA HORARIOS--------------------------
if(!empty($_GET["fecha"])){
    $hoy = $_GET["fecha"];
}else{
    $hoy = date("Y-m-d");
}
$dia_hoy = date("w", strtotime($hoy));


function compareByHash($a, $b) {
    return strcmp($a['hash'], $b['hash']);
}


$debug = false;
if(isset($_GET["debug"])){
    $debug = true;
    print_r( $db->querySingle('select now()'));
}
$periodo_sgu_old = 0;
$log_desc = "";


/*$cambiocarreras_rs = $db->query('SELECT CLAVE_MATERIA, clave_carrera FROM materia join carrera using(carrera_id)');

function getCarrera($claveBuscar){
    global $cambiocarreras_rs;
    $i = array_search($claveBuscar, array_column($cambiocarreras_rs, 'clave_materia'));
    if($i>=0)
        return $cambiocarreras_rs[$i]["clave_carrera"];
    return $cambiocarreras_rs[0]["clave_carrera"];
}*/

//------------------ACTUALIZA SALONES----------------------

$pag = "https://portal.ulsa.edu.mx/servicios/AuditoriaAsistencialRest/AuditoriaAsistencialService.svc/auditoriaAsistencial/catalogos/espacios/seleccionar";
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL => $pag,
    CURLOPT_RETURNTRANSFER => true,
    //CURLOPT_ENCODING => "",
    //CURLOPT_MAXREDIRS => 10,
    // CURLOPT_TIMEOUT => 0,
    //CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => json_encode([]),
    CURLOPT_HTTPHEADER => [
        "token: ".$token,
        "username: SGU_APSA_AUD_ASIST",
        "Content-Type: application/json",
        'Transfer-Encoding: chunked'
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err)
    die("cURL Error #:$err");
$salonesData = json_decode($response, true);

//$salonesTotal_rs = $db->count('salon');
$salonesTotal_rs = $db->where('salon_id', 0, '>')->count('salon');
echo "$salonesTotal_rs tiene " . count($salonesData) . " salones<br>";
//if($salonesTotal_rs < count($salonesData)){//faltan salones en BD
    $salones_rs = $db->query('SELECT id_espacio_sgu, salon FROM salon');
    //claves de espacios
    $arreglo_espacios = array_map(function ($item) {
        return $item['id_espacio_sgu'];
    }, $salones_rs);
    $arreglo_nombres = array_map(function ($item) {
        return $item['salon'];
    }, $salones_rs);

    foreach($salonesData as $data){
        if( !in_array($data["IdEspacio"], $arreglo_espacios) || !in_array($data["NombreEspacio"], $arreglo_nombres)){
            //Insertar espacio
            if($debug){
                echo "Espacio nuevo: ".$data["NombreEspacio"]."<br>";
            }else{
                $db->query('INSERT INTO SALON (salon, id_espacio_sgu, id_espacio_padre) VALUES (:salon, :id, :id_padre)
                    ON CONFLICT (id_espacio_sgu) DO UPDATE SET salon = :salon',
                    [":salon"=>$data["NombreEspacio"], ":id"=>$data["IdEspacio"], ":id_padre"=>$data["IdEspacioPadre"]]);
            }
        }
    }
//}
// -----------------------------

$pag = "https://portal.ulsa.edu.mx/servicios/AuditoriaAsistencialRest/AuditoriaAsistencialService.svc/auditoriaAsistencial/seleccionar";
$elementos_bd_total = [];
$elementos_sgu_total = [];
$periodo_sgu_old = 0;
try{
    $pdo->beginTransaction();

    
    $periodos_rs = $db->query('SELECT periodo_id, id_periodo_sgu, nivel_id FROM periodo WHERE :hoy BETWEEN periodo_fecha_inicio AND periodo_fecha_fin AND id_periodo_sgu != 0 ORDER BY periodo_id',
        [":hoy"=>$hoy]);
    foreach ($periodos_rs as $per){

        //Verifica si el día de hoy es festivo
        $vacacion_rs = $db->querySingle('select es_festivo(:per, :hoy)', [":per"=>$per["periodo_id"], ":hoy"=>$hoy]);
        if($vacacion_rs["es_festivo"]){
            if($debug){
                echo "<h3>Dia festivo en Periodo: ".$per["id_periodo_sgu"]."[".$per["periodo_id"]."]</h3>";
            }
            continue;
        }
        
        $carreras_rs = $db->query('SELECT c.clave_carrera, c.carrera_id FROM carrera c WHERE nivel_id = :nivel',
        [":nivel"=>$per["nivel_id"]]);
        if($debug){
            echo "<h3>Periodo: ".$per["id_periodo_sgu"]."[".$per["periodo_id"]."] nivel: ".$per["nivel_id"]."</h3>";
            //print_r($carreras_rs);
        }
        if ($periodo_sgu_old != $per["id_periodo_sgu"]){
            $periodo_sgu_old = $per["id_periodo_sgu"];
            $params = [
                'idPeriodo'=>$per["id_periodo_sgu"],
                'fecha'=>$hoy
            ];
        
            $curl = curl_init();
            curl_setopt_array($curl, [
                CURLOPT_URL => $pag,
                CURLOPT_RETURNTRANSFER => true,
                //CURLOPT_ENCODING => "",
                //CURLOPT_MAXREDIRS => 10,
                //CURLOPT_TIMEOUT => 0,
                //CURLOPT_CUSTOMREQUEST => "POST",
                CURLOPT_POSTFIELDS => json_encode($params),
                CURLOPT_HTTPHEADER => [
                    "token: ".$token,
                    "username: SGU_APSA_AUD_ASIST",
                    "Content-Type: application/json"
                ],
            ]);

            $response = curl_exec($curl);
            $err = curl_error($curl);

            /*echo "Response<br>";
            print_r($response);*/

            curl_close($curl);

            if ($err)
                die("cURL Error #:$err");
        }
        $selectedData = json_decode($response, true);
    
        //claves de carreras en el periodo
        $arreglo_claves = array_map(function ($item) {
            return $item['clave_carrera'];
        }, $carreras_rs);

        //print_r($selectedData); exit();
        $sguHash = array();
        if(!empty($selectedData)){
            
            //Recorre SGU y genera hash
            foreach( $selectedData as $row ){
                if(!$row["EsMateriaPorReposicion"]){
                    $carrera = $row["ClaveCarrera"];
                    if(is_null($carrera) || empty($carrera))
                        $carrera = '0';
                    /*else{
                        if(!$row["EsMateriaPorAsignacion"]) 
                            $carrera = getCarrera($row["ClaveMateria"]);
                    }*/
                    
                    $sguHash[] = array(
                        "hash"=>( trim($row["HoraInicio"]."|".($row["NombreMateria"])."|".(trim($row["ClaveProfesor"])==""?"000000":trim($row["ClaveProfesor"]))."|".$row["IdEspacio"]."|".$per["periodo_id"]) ),
                        "data"=>$row,
                        "per"=>$per["periodo_id"]
                    );
                }else{//reposición
                    try{
                        if(in_array($row["ClaveCarrera"] , $arreglo_claves)){
                            //busca yyyy-mm-dd hh:mm:ss en la cadena
                            if (preg_match("/\d{4}-\d{2}-\d{2} de \d{2}:\d{2}:\d{2}/", $row["Observaciones"], $matches)) {
                                $fecha_orig =  str_replace(" de", "", $matches[0]);
                                $fecha_nueva = $row["FechaStr"]." ".$row["HoraInicio"];
                                $hora_fin_nueva = $row["HoraFin"];
                                if($debug){
                                    echo "<br>SELECT * FROM fi_reposicion_sgu('$fecha_orig', '".$hora_fin_nueva."','".$fecha_nueva."' ,'".$row["ClaveProfesor"]."', ".$per["periodo_id"].", ".$row["IdEspacio"].")";
                                }else{
                                    $db->query('SELECT * FROM fi_reposicion_sgu(:fecha_orig, :hora_fin, :fecha_rep, :prof, :per, :salon)',
                                        [":fecha_orig"=>$fecha_orig, ":hora_fin"=>$hora_fin_nueva, ":fecha_rep"=>$fecha_nueva, ":prof"=>$row["ClaveProfesor"], ":per"=>$per["periodo_id"], ":salon"=>$row["IdEspacio"] ]);
                                    $log_desc .="SELECT * FROM fi_reposicion_sgu($fecha_orig, ".$fecha_nueva.", ".$row["ClaveProfesor"].", ".$per["periodo_id"].") ## ";
                                }
                            }else{
                                if($debug)
                                    echo "No se encontró fecha y hora en: ".$row["Observaciones"]."<br>";
                            }
                        }
                    }catch(Exception $e){
                        echo "ERROR Reposición<br>".$e->getMessage();
                    }
                }
            }
            unset($selectedData);
        }
        
        echo count($sguHash)."Total <br>";
    
        $horarios_sgu = [];
        
        /*
        print_r($carreras_rs); 
        echo "<br><hr><br>";*/
        print_r($arreglo_claves);
        echo "<br><hr><br>";

        //$areacomun = array();
        foreach($sguHash as $sgu){
            if(in_array($sgu["data"]["ClaveCarrera"] , $arreglo_claves) /*&& !in_array($sgu["data"]["ClaveMateria"], $areacomun)*/){
                $horarios_sgu[] = $sgu;
            }
        }
        
        //print_r($horarios_sgu);exit();
        unset($sguHash);
        $elementos_sgu_total = array_merge($elementos_sgu_total, $horarios_sgu);
        
        //Recorre BD y genera hash
        $horarios_rs = $db->query('SELECT * FROM fs_horarios_hash(:dia, :periodo, :fecha)',
            [':dia' => $dia_hoy, ':periodo' => $per["periodo_id"], ':fecha'=>$hoy]);
            //echo "**** SELECT * FROM fs_horarios_hash($dia_hoy, ".$per["periodo_id"].")<br>";
        
        //usort($horarios_rs, 'compareByHash');
        $elementos_bd_total = array_merge($elementos_bd_total, $horarios_rs);
        
    }//foreach periodo
    //print_r($elementos_sgu_total); 
//exit();
    if($debug){
        echo "<h3>Resumen</h3>";
        echo "<h5>SGU [".count($elementos_sgu_total)."]</h5>";
        echo "<h5>BD [".count($elementos_bd_total)."]</h5>";
    }
    // Extraer los "hash" de $lista y $lista2 en arreglos separados
    $hashes_sgu = array_column($elementos_sgu_total, 'hash');
    $hashes_bd = array_column($elementos_bd_total, 'hash');

    
    //print_r($elementos_sgu_total); 
    
    //------------------
    // Encontrar los "hash" que están en $sgu pero no están en $bd
    //$hashes_no_en_sgu = array_udiff($hashes_bd, $hashes_sgu, 'strcasecmp');
    $hashes_no_en_sgu = array_udiff($hashes_bd, $hashes_sgu, function($a, $b){
        return strcasecmp(quitaAcentos($a), quitaAcentos($b));
    });

    if($debug) echo "hashes_no_en_sgu ".count($hashes_no_en_sgu)."<br>";

    if(count($hashes_no_en_sgu)>0){
        // Ahora puedes obtener los elementos completos que cumplen la condición original
        $elementos_no_en_sgu = array_filter($elementos_bd_total, function ($item) use ($hashes_no_en_sgu) {
            return in_array($item['hash'], $hashes_no_en_sgu);
        });
        if($debug){
            print_r($elementos_no_en_sgu);
            echo "Sobran ".count($elementos_no_en_sgu)." en BD<br>";
        }

        //Update fecha_fin
        $log_desc = "";
        foreach($elementos_no_en_sgu as $row){
            try{
                if($debug){
                    echo "<br>SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].");";
                }else{
                    $db->query('SELECT * FROM fu_horario_deshabilita(:horario)', [":horario"=>$row["horario_id"]]);
                    $log_desc .="SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].") ## ";
                }
            }catch(Exception $e){
                echo "ERROR horario deshabilita<br>".$e->getMessage();
            }
        }
        if(!$debug && !empty($log_desc)){
            $log = new LogCambios(__DIR__."/log/");
            $log->appendLog($log_desc);
        }
    }

    // Encontrar los "hash" que están en $sgu pero no están en $bd
    //$hashes_no_en_bd = array_udiff($hashes_sgu, $hashes_bd, 'strcasecmp');
    $hashes_no_en_bd = array_udiff($hashes_sgu, $hashes_bd, function($a, $b){
        return strcasecmp(quitaAcentos($a), quitaAcentos($b));
    });

    //echo "hashes_no_en_bd ".count($hashes_no_en_bd)."<br>";
    

    if(count($hashes_no_en_bd)>0){
        // Ahora puedes obtener los elementos completos que cumplen la condición original
        $elementos_no_en_bd = array_filter($elementos_sgu_total, function ($item) use ($hashes_no_en_bd) {
            return in_array($item['hash'], $hashes_no_en_bd);
        });
        if($debug){
            echo "<br>Faltan ".count($elementos_no_en_bd)." en BD<br>";
            print_r($elementos_no_en_bd); echo "<br>";
        }
        

        //Inserts
        foreach($elementos_no_en_bd as $row){
            if($row["data"]["ClaveMateria"] == "-")
                $row["data"]["ClaveMateria"] = "";
            if($debug){
                echo "<br>SELECT * FROM fi_horario($dia_hoy, '".$row["data"]["HoraInicio"]."','".$row["data"]["HoraFin"]."','"
                .$row["data"]["ClaveDependencia"]."','"
                .$row["data"]["ClaveCarrera"]."','"
                .$row["data"]["NombreMateria"]."','"
                .$row["data"]["ClaveMateria"]."','"
                .$row["data"]["ClaveProfesor"]."','"
                .$row["data"]["NombreProfesor"]."','"
                .$row["data"]["CorreoElectronico"]."','"
                .$row["data"]["Grupo"]."',"
                .$row["data"]["IdEspacio"].","
                .$row["per"].");";
                if($row["data"]["EsMateriaPorAsignacion"]){ echo " ***Asignacion directa***";}
            }else{
                $horario_new_rs = $db->querySingle('SELECT * FROM fi_horario(:hoy, :ini, :fin, :dep, :carr, :nom_mat, :cve_mat, :cve_prof, :nom_prof, :correo, :gpo, :espacio, :periodo)',
                    [":hoy"=>$dia_hoy,
                    ":ini"=>$row["data"]["HoraInicio"],
                    ":fin"=>$row["data"]["HoraFin"],
                    ":dep"=>$row["data"]["ClaveDependencia"],
                    ":carr"=>$row["data"]["ClaveCarrera"],
                    ":nom_mat"=>$row["data"]["NombreMateria"],
                    ":cve_mat"=>$row["data"]["ClaveMateria"],
                    ":cve_prof"=>$row["data"]["ClaveProfesor"]==""?"000000":$row["data"]["ClaveProfesor"],
                    ":nom_prof"=>$row["data"]["NombreProfesor"],
                    ":correo"=>$row["data"]["CorreoElectronico"],
                    ":gpo"=>$row["data"]["Grupo"],
                    ":espacio"=>$row["data"]["IdEspacio"],
                    ":periodo"=>$row["per"]
                    ]
                );
                //echo $horario_new_rs["fi_horario"]."<br>";
                if($horario_new_rs["fi_horario"] > 0){
                    if($row["data"]["EsMateriaPorAsignacion"]){
                        $matasig_rs = $db->querySingle('SELECT * FROM fi_materia_asignacion(:hor,:mat,:carr, :prof)',
                            [":hor"=>$horario_new_rs["fi_horario"],
                            ":mat"=>$row["data"]["NombreMateria"],
                            ":carr"=>$row["data"]["Carrera"],
                            ":prof"=>$row["data"]["NombreProfesor"]
                            ]
                        );
                    }

                    $log_desc .="SELECT * FROM fi_horario($dia_hoy, '".$row["data"]["HoraInicio"]."','".$row["data"]["HoraFin"]."','"
                    .$row["data"]["ClaveDependencia"]."','"
                    .$row["data"]["ClaveCarrera"]."','"
                    .$row["data"]["NombreMateria"]."','"
                    .$row["data"]["ClaveMateria"]."','"
                    .$row["data"]["ClaveProfesor"]."','"
                    .$row["data"]["NombreProfesor"]."','"
                    .$row["data"]["CorreoElectronico"]."','"
                    .$row["data"]["Grupo"]."',"
                    .$row["data"]["IdEspacio"]."); [ID=".$horario_new_rs["fi_horario"]."] ##";
                }
                
            }
        }
        if(!$debug && !empty($log_desc)){
            $log = new LogCambios(__DIR__."/log/");
            $log->appendLog($log_desc);
        }
        
    }
    $stmt = null; // cierra conexion

    if($debug) {
        echo "<br><br><hr><br><br>";
        usort($elementos_sgu_total, 'compareByHash');
        usort($elementos_bd_total, 'compareByHash');

        echo "<table><tr>";
        echo "<td valign='top'>";
        echo "<h5>SGU [".count($elementos_sgu_total)."]</h5>";
        foreach($elementos_sgu_total as $sgu){
            echo $sgu["hash"]."<br>";
        }
        echo "</td>";
        echo "<td valign='top'>";
        echo "<h5>BD [".count($elementos_bd_total)."]</h5>";
        foreach($elementos_bd_total as $sgu){
            echo $sgu["hash"]." [".$sgu["horario_id"]."]<br>";
        }
        echo "</td>";
        echo "</tr></table>";
    }else{
        $pdo->commit();
        echo "Commit";
    }
} catch(PDOException $e) {
    echo "Error";
    "ERROR BD! ".$e->getMessage();
    $pdo->rollBack();
    if(!$debug){
        $log = new LogCambios(__DIR__."/log/");
        $log->appendLog("ERROR BD! ".$e->getMessage());
    }
    print_r($e->getMessage());
} catch(Exception $e2){
    echo "Error";
    print_r($e2->getMessage());
}


?>
