<?php
namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use App\Http\Controllers\IAController;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;

use DateTime;
use DB;
use stdClass;
use Log;

class BatchEdictosController extends Controller {

    /* 
        Esta funcion realiza una consulta para saber si existen edictos cargados del dia anterior.
        Si existen realiza arma un batch para mandar a la AI.
            Notas: La consulta se basa en el dia anterior, por lo que si se ejecuta hoy, busca si ayer se cargaron edictos ( ej: Martes busca los del Lunes )
                Los dias Sabado y Domingo se hace otro proceso.
    */    
    public static function procesoEdictosDiario() {
        try {
            // Obtener el dia habil anterior
            $obtenerDia = Misc::obtenerDiaHabilAnterior();                        
            // Validar que la fecha obtenida sea valida
            if (empty($obtenerDia) || !strtotime($obtenerDia)) {
                throw new Exception("Fecha no válida obtenida: " . $obtenerDia);
            }            
            define('ID_PROMPT', '23');            
            //define('ID_PROMPT', '56'); // ID del prompt de batch edictos que usa el modelo 4.1-mini
            define('TIPO_BATCH', 1);
                        
            Misc::escribirLogbatch('Obteniendo el día de ayer: ' . $obtenerDia);
            Misc::escribirLogbatch('Enviando parámetros para generar el batch');            
    
            return IAController::generarFileBatchIADiario($obtenerDia, ID_PROMPT, 0, TIPO_BATCH);
        } catch (Exception $e) {
            
            Misc::escribirLogbatch('Error en procesoEdictosDiario: ' . $e->getMessage(), 'ERROR');
            
            return 'Error en procesoEdictosDiario: ' . $e->getMessage(); 
        }
    }

    public static function procesoEdictosSinRZbkp(){
        $idPrompt = '23'; // Este es el id del prompt de batch edictos que usa el modelo 4o-mini
        $user_id = 0;
        $obtenerDia = Misc::obtenerDiaHabilAnterior();

        $tipoBatch = 3;
        
        return IAController::generarFileBatchIADiario($obtenerDia, $idPrompt, $user_id,$tipoBatch);                             
        //return IAController::generarFileBatchSinRZ($obtenerDia, $idPrompt, $user_id);                             
        //
    }

    public static function procesoEdictosSinRZ(){
        try {
            $obtenerDia = Misc::obtenerDiaHabilAnterior();

            if (empty($obtenerDia) || !strtotime($obtenerDia)) {
                throw new Exception("Fecha no válida obtenida: " . $obtenerDia);                
            }
        } catch (\Throwable $th) {
            //throw $th;
        }
    }

    public static function consultaEstadoBatchRZ(){
        $tipoBatch = 3;
        
        return self::verificarEstadoBatch($tipoBatch);
    }


    public static function consultaEstadoBatchDiario(){
        $tipoBatch = 1;
        
        return self::verificarEstadoBatch($tipoBatch);
    }

    /* 
        Funcion que verifica el estado del batch
        Se manda como parametro el id del file batch que se desea consultar el estado
    */
    public static function verificarEstadoBatch($tipoBatch){
        // Tomo el registro mas reciente de la tabla de proceso de edictos 
        $ultimoProceso = '';
        $carpeta = NULL;
        $batchtype = NULL;

        if ($tipoBatch == 1) {
            $batchtype = 'BD';
            $carpeta = 'batchDiario';
        }elseif ($tipoBatch == 3) {
            $batchtype = 'BSRZ';
            $carpeta = 'batchSinRZ';
        }
        
        $tablaProcesos = SQLConnection::backendStoreProcedure('sp_ProcessBatchAi',['LAST_BATCH', NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,$batchtype]);         
        
        //$tablaProcesos = SQLConnection::backendStoreProcedure('sp_ProcessBatchAi',['LAST_BATCH', NULL]);   
        if(empty($tablaProcesos)){
            return 'No se encontro un batch para consultar';
        }
        
        Misc::escribirLogbatch('Consultado estado de batch con fecha de: ' . $tablaProcesos[0]->fecha_consultado . 'y tipo' . $tablaProcesos[0]->batch_type); 
        
        $batchFileID = $tablaProcesos[0]->id_batch;
        
        $consultaBatch = OpenAiController::verificarEstadoBatch($batchFileID,$carpeta);           
        
        try {
            if (isset($consultaBatch['output_file_id']) && !empty($consultaBatch['output_file_id'])) {                
                
                echo $consultaBatch['status'];
                Misc::escribirLogbatch('Estado de batch: ' . $consultaBatch['status'] . ', cantidad para procesar ' . $consultaBatch['request_counts']['total'] . ', cantidad procesado ' . $consultaBatch['request_counts']['completed']); 

                $outputId =  $consultaBatch['output_file_id']; 
                
                OpenAiController::obtenerResultadoBatchDiario($outputId,$carpeta);                

                return 'Se guardo con exito el batch procesado';
                Misc::escribirLogbatch('Se guardo con exito el batch procesado'); 

                                 
            }else {                
                Misc::escribirLogbatch('El estado del batch es: ' . $consultaBatch['status']);

                return $consultaBatch['status'];
            }
        } catch (\Throwable $th) {
            return 'Ocurrio un error al realizar la consulta.';
        }

        return 0;
    }

    /**
     * Se van a procesar lotes de edictos que quedaron sueltos o viejos
     * @todo terminar de desarrollar la función
     *  */ 
    public static function procesadoLotesHuerfanos(){
        /* 
            En el SP [openai_edictos_dia]
            nueva accion 
            BUSQUEDA_SIN_PROCESAR

            Trae todos los registros no procesados con un TOP que le mandas
        */
        $test = SQLConnection::backendStoredProcedure('openai_edictos_dia', ['BUSQUEDA_SIN_PROCESAR', 30]);
        dd($test);
    }
}