<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\File;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use stdClass;
use Response;
use CURLFile;
use Session;
use Request;
use Route;
use DB;


class OpenAiController extends Controller{     
     
    // Endopoint que sirve para cargar los archivos(batch) a OpenAI
    public static function openAiFileEndpoit($batchFile){
        $apiKey = env("apiKey_chatgpt"); 
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/files");
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Authorization: Bearer $apiKey",
            "Content-Type: multipart/form-data"
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, [
            'purpose' => 'batch',
            'file' => new CURLFile(realpath($batchFile))
        ]);
    
        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            return response()->json(['error' => 'cURL error: ' . curl_error($ch)], 500);
        }
    
        curl_close($ch);
        
        $respuesta = json_decode($response, true);
        
        return $respuesta;
    }   

    // Esta funcion lista todos los batch que se realizaron 
    public static function listarBatchProcesos(){
        $apiKey = env("apiKey_chatgpt"); 
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/batches?limit=20");

        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Authorization: Bearer $apiKey",
            "Content-Type: application/json"
        ]);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            return response()->json(['error' => 'cURL error: ' . curl_error($ch)], 500);
        }
    
        curl_close($ch);
        $respuesta = json_decode($response, true);
        
        return $respuesta;
    }

    /**
    * Con esta funcion obtenemos la respuesta de un batch procesado
    * el resultado se guarda en un json en la carpeta de compartido
    */
    public static function obtenerResultadoBatch(){
        $apiKey = env("apiKey_chatgpt"); 

        $batchIdOutput = 'file-test';
        $url = "https://api.openai.com/v1/files/$batchIdOutput/content";
        $pathGuardarResultado = '/var/www/html/compartido/openAIBatch/';

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Authorization: Bearer $apiKey"
        ]);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            return 'Error: ' . curl_error($ch);
        } else {
            file_put_contents($pathGuardarResultado . 'batch_output.jsonl', $response);
            return "El archivo se genero con exito como batch_output.jsonl";
        }

        curl_close($ch);        
    }

    // Esta funcion procesa el batch generado 
    public static function procesarBatchAI($idBatch,$matchedModelId, $id_prompt,$user_id, $fechaFormateada){
        $apiKey = env("apiKey_chatgpt"); 
        // Inicializa cURL
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/batches");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Authorization: Bearer $apiKey",
            "Content-Type: application/json"
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
            "input_file_id" => $idBatch,
            "endpoint" => "/v1/chat/completions",
            "completion_window" => "24h"
        ]));

        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            return response()->json(['error' => 'cURL error: ' . curl_error($ch)], 500);
        }
    
        curl_close($ch);
        $respuesta = json_decode($response, true);
        $respuestaApi = json_encode($respuesta, true);        
        
        SQLConnection::backendStoreProcedure('sp_ProcessBatchAi', ['INSERT_BATCH', $respuesta['id'], $respuestaApi, $matchedModelId, $id_prompt, $respuesta['status'], $user_id, $fechaFormateada, null]);             
        
        return $respuesta;
    }

    // Funcion para verifica el estado de un batch 
    public static function verificarEstadoBatch($batch_id){
        $apiKey = env("apiKey_chatgpt"); 

        $url = "https://api.openai.com/v1/batches/$batch_id";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $apiKey,
            'Content-Type: application/json'
        ]);

        $response = curl_exec($ch);
        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            die("Error en la solicitud cURL: $error");
        }

        curl_close($ch);
        
        $resultado = json_decode($response, true);
        $respuestaApi = json_encode($response, true);

        SQLConnection::backendStoreProcedure('sp_ProcessBatchAi', ['EDIT_BATCH', $batch_id, $respuestaApi, null, null, $resultado['status'], null]);
        
        return $resultado;
    }

    public static function completionsEndpoint($dataString){
        // URL y cabeceras de la API
        $url = 'https://api.openai.com/v1/chat/completions';
        $headers = [
            "Content-Type: application/json",
            "OpenAI-Organization: " . env("Organization_CHATkey"),
            "Authorization: Bearer " . env("apiKey_chatgpt")
        ];

        // Inicializar cURL
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $dataString,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true
        ]);

        // Realizar la solicitud
        $response = curl_exec($ch);
        
        // Manejo de errores cURL
        if (curl_errno($ch)) {
            curl_close($ch);
            return 'Error en la solicitud: ' . curl_error($ch);
        }

        curl_close($ch);

        $respuesta = json_decode($response, true);

        return $respuesta;
    }

    // Formateo del batch para enviar a OpenAI 
    public static function formateoBatch($fechaEdicto,$idFide,$fuente,$model,$contentSystem,$contentUser,$contenido_archivo,$tokens){
        // Crear el UUID formateado para el edicto
        $uuid = uniqid("{$fuente}_{$fechaEdicto}_{$idFide}_", true);

        $batchFormateo = [
            "custom_id" => $uuid,
            "method" => "POST",
            "url" => "/v1/chat/completions",                
            "body" => [
                "model" => $model,
                "messages" => [
                    ["role" => "system", "content" => $contentSystem],
                    ['role' => 'user', 'content' => $contentUser],
                    ["role" => "assistant", "content" => $contenido_archivo] 
                ],
                "temperature" => 0,
                "max_completion_tokens" => $tokens
            ]
        ];
        
        return $batchFormateo;
    }

    public static function formateoCompletions($ai_provider,$system_prompt,$user_prompt,$textoDatos,$tokens){        
        // Preparar los datos para la solicitud
        $requestData = [
            'model' => $ai_provider,
            'messages' => [
                ['role' => 'system', 'content' => $system_prompt],
                ['role' => 'user', 'content' => $user_prompt],
                ['role' => 'assistant', 'content' => $textoDatos]
            ],
            'temperature' => 0,
            'max_completion_tokens' => $tokens
        ];

        $dataString = json_encode($requestData);
        
        return $dataString;
    }   
}