<?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;
    }   

    public static function entrEnd($batchFile){
        $apiKey = ENV('apiKey_chatgpt');

        $filePath = '/var/www/html/compartido/batchinput.jsonl';        

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/files');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);

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

        curl_setopt($ch, CURLOPT_POSTFIELDS, [
            'purpose' => 'fine-tune',
            'file' => new CURLFile($filePath)
        ]);

        $response = curl_exec($ch);
        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);        
    }

    public static function obtenerResultadoBatchDiario($outputFileId, $carpeta){
        $apiKey = env("apiKey_chatgpt"); 

        //$batchIdOutput = 'file-test';
     
        
        $url = "https://api.openai.com/v1/files/$outputFileId/content";
        //$pathGuardarResultado = '/var/www/html/compartido/openAIBatch/batchDiario/';
        $pathGuardarResultado = '/var/www/html/compartido/openAIBatch/';
        
              
        if (!is_null($carpeta)) {
            $pathGuardarResultado = '/var/www/html/compartido/openAIBatch/' . $carpeta . '/';            
        }
         
        $fecha_actual = date('Y-m-d');

        // Crear la ruta completa de la nueva carpeta
        $pathGuardarResultado = $pathGuardarResultado . $fecha_actual . '/';

        $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,$batchType){
        $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, $batchType]);             
        
        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 formatBatch($dateEdict, $idFide, $source, $model, $systemContent, $userContent, $fileContent, $maxTokens) {
        $uuid = uniqid("{$source}_{$dateEdict}_{$idFide}_", true);

        $batchFormat = [
            "custom_id" => $uuid,
            "method" => "POST",
            "url" => "/v1/chat/completions",
            "body" => [
                "model" => $model,
                "messages" => [
                    ["role" => "system", "content" => $systemContent],
                    ["role" => "user", "content" => $userContent],
                    ["role" => "assistant", "content" => $fileContent]
                ],
                "tools" => [
                    [
                        "type" => "function",
                        "function" => $functionSchema
                    ]
                ],
                "tool_choice" => [
                    "type" => "function",
                    "function" => [
                        "name" => "completar_datos_edictos"
                    ]
                ],
                "temperature" => 0,
                "max_tokens" => $maxTokens
            ]
        ];

        return $batchFormat;
    }

    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;
    }    

    public static function erroresArchivo(){
        $apiKey = 'TU_API_KEY'; // Sustituye con tu clave API de OpenAI
        $errorFileId = 'file-FzYCLUUmk5xHVCDKXjoqjP'; // ID del archivo de errores
        $outputFile = 'error_details.jsonl'; // Nombre del archivo donde se guardarán los errores

        // Configuración de la URL y los encabezados
        $url = "https://api.openai.com/v1/files/$errorFileId/content";
        $headers = [
            "Content-Type: application/json",
            "OpenAI-Organization: " . env("Organization_CHATkey"),
            "Authorization: Bearer " . env("apiKey_chatgpt")
        ];

        // Inicializar cURL
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        // Ejecutar la solicitud y obtener el contenido
        $response = curl_exec($ch);        

        // Verificar si hubo un error
        if (curl_errno($ch)) {
            echo 'Error en cURL: ' . curl_error($ch);
        } else {
            // Guardar el contenido del archivo de errores
            file_put_contents($outputFile, $response);
            echo "Archivo de errores guardado en '$outputFile'.\n";
        }

        // Cerrar la sesión cURL
        curl_close($ch);
    }


    /**
    * Obtiene la lista de modelos disponibles desde la API de OpenAI
    *
    * Esta funcion hace una solicitud a la API de OpenAI para obtener la lista de modelos disponibles 
    *
    * @return array La lista de modelos disponibles desde la API de OpenAI
    */
    public static function obtenerModelosGpt()
    {
        // URL de la API de OpenAI para obtener modelos
        $url = 'https://api.openai.com/v1/models';

        $apiKey = env("apiKey_chatgpt");

        // Inicializa una session cURL
        $ch = curl_init($url);

        // Configura las opciones de cURL
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $apiKey
        ]);

        // Ejecuta la solicitud cURL y obtiene la respuesta
        $response = curl_exec($ch);

        // Cierra la session cURL
        curl_close($ch);

        $models = json_decode($response, true);

        return $models['data'];
    }

    public static function listarArchivosOpenAI(): array{
        $apiKey = env("apiKey_chatgpt");
        $curl = curl_init();
        curl_setopt_array($curl, [
            CURLOPT_URL => "https://api.openai.com/v1/fine_tuning/jobs",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer {$apiKey}",
                "Content-Type: application/json",
            ],
        ]);

        $response = curl_exec($curl);

        if (curl_errno($curl)) {
            throw new Exception('Error en cURL: ' . curl_error($curl));
        }

        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);

        if ($httpCode !== 200) {
            throw new Exception("Error en la respuesta HTTP: Código $httpCode");
        }

        $data = json_decode($response, true);

        if (!isset($data['data'])) {
            throw new Exception("Estructura inesperada en la respuesta: " . $response);
        }

        return $data['data'];
    }

    public static function dataJsonStructurebkp(){
       $apiKey = env('apiKey_chatgpt');

        $functionSchema = [
            "name" => "completar_datos_edictos",
            "description" => "Completa la estructura JSON de datos societarios",
            "parameters" => [ 
                "type" => "object",
                "properties" => [
                    "Datos_Empresa" => [
                        "type" => "object",
                        "properties" => [
                            "nombre_actual" => ["type" => "string"],
                            "nombre_anterior" => ["type" => "string"],
                            "cuit_empresa" => ["type" => "string"],
                            "domicilio_actual" => ["type" => "string"],
                            "domicilio_anterior" => ["type" => "string"],
                            "empresa_tipo" => ["type" => "string"]
                        ],
                        "required" => ["nombre_actual", "cuit_empresa"]
                    ],
                    "Relacion_Personas" => [
                        "type" => "array",
                        "items" => [
                            "type" => "object",
                            "properties" => [
                                "apellido_nombre" => ["type" => "string"],
                                "persona_DNI" => ["type" => "string"],
                                "persona_cuit" => ["type" => "string"],
                                "persona_domicilio" => ["type" => "string"],
                                "persona_estado_civil" => ["type" => "string"],
                                "persona_conyuge_nombre" => ["type" => "string"],
                                "persona_conyuge_DNI" => ["type" => "string"],
                                "Persona_Cargo" => [
                                    "type" => "array",
                                    "items" => [
                                        "type" => "object",
                                        "properties" => [
                                            "p_rol" => ["type" => "string"],
                                            "permanece_en_cargo" => ["type" => "string"]
                                        ],
                                        "required" => ["p_rol", "permanece_en_cargo"],
                                        "additionalProperties" => false
                                    ]
                                ],                               
                            ]
                        ]
                    ],
                    "Relacion_Empresas" => [
                        "type" => "array",
                        "items" => [
                            "type" => "object",
                            "properties" => [
                                "Vinculada_nombre" => ["type" => "string"],
                                "Vinculada_cuit" => ["type" => "string"],
                                "Vinculada_Pais" => ["type" => "string"],
                                "Vinculada_domicilio" => ["type" => "string"],
                                "Vinculada_vinculo" => [
                                    "type" => "array",
                                    "items" => ["type" => "object", "properties" => ["e_rol" => ["type" => "string"]]]
                                ]
                            ]
                        ]
                    ],
                    "Datos_Generales" => [
                        "type" => "object",
                        "properties" => [
                            "tipo_edicto" => ["type" => "string"],
                            "fecha_asamblea" => ["type" => "array", "items" => ["type" => "string"]]
                        ]
                    ]
                ],
                "required" => ["Datos_Empresa", "Relacion_Personas", "Relacion_Empresas", "Datos_Generales"]
            ]
        ];

        $texto = <<<TEXT
            GRAS AUTOMOTORES SA DESIGNACION DE AUTORIDADES Por disposicion del Sr Juez a cargo del Registro Publico de la ciudad de Santa Fe en autos caratulados GRAS AUTOMOTORES SA S/ DESIGNACION DE AUTORIDADES CUIJ N 21052151624 se ha ordenado la siguiente publicacion correspondiente a la designacion de autoridades de GRAS AUTOMOTORES SA segun acta de Asamblea Ordinaria de fecha 20 de agosto de 2024  Director titular y Presidente el Sr GRAS Sebastian DNI N  32184725 CUIT N 20321847251 nacido en fecha 09081987 soltero comerciante domiciliado en calle 27 N 2755 de la ciudad de San Justo Provincia de Santa Fe y como Director Suplente el Sr GRAS Alejandro DNI N  33111689 CUIT N  20331116891 nacido en fecha 01031986 divorciado comerciante domiciliado en Bv Pellegrini N 2723 de la ciudad de San Justo Provincia de Santa Fe  Santa Fe 10 de Diciembre de 2024 Fdo Dra Liliana G Piana Secretaria
        TEXT;

        $data = [
            "model" => "gpt-4o",
            "messages" => [
                [
                    "role" => "system",
                    "content" => "Completá la estructura JSON societaria a partir del texto del edicto, sin inventar datos."
                ],
                [
                    "role" => "assistant",
                    "content" => '
                        * Evita títulos y explicaciones.
                        * Respetar la estructura JSON solicitada.
                        * No inventar datos. Sólo informar los contenidos en el Edicto.
                        * No incluyas claves con valores nulos.
                        * No incluyas claves con valor "No disponible" o "Null".
                        * Valores como SA, S.A., SRL, S.R.L., SL, S.L., SAS, INC, LLC son referidos a empresa_tipo.
                        * En Datos_Empresa, NO informar cuit_empresa si comienza con "2".
                        * En el nodo persona_estado_civil, indicar si es casado/a o soltero/a solo si esta información está disponible. En caso de indicar con quien esta casado/a, agregar el nodo persona_conyuge con el nombre de la persona.
                        * En persona_cargo:
                        ** Considera los cargos de “Presidente”, “Gerente”, “Director”, “Director Titular”, “Director Suplente”, “Apoderado”, “Socio”, por su rol DENTRO de la empresa.
                        ** El formato debe ser: "Persona_Cargo": [{"p_rol": " ", "permanece_en_cargo": "si/no"}]
                        * En el nodo permanece_en_cargo, indicar:
                        - "no" cuando la persona falleció, renunció, cesó o fue removida de su cargo.
                        - "si" en todos los demás casos (incluso si no se menciona expresamente).
                        * En Vinculada_vinculo:
                        ** Considera la vinculación de “Socio”, “Relacionadas”, “Controladas”, “Controlantes”, por su rol DENTRO de la empresa.
                        ** El formato debe ser: "Vinculada_vinculo": [{"e_rol": " "}]
                        ** Cada rol debe expresarse de forma separada.
                        * En el nodo tipo_edicto indicar el objeto principal del edicto.
                        * En el nodo cuit_empresa, aplicar este regex: str.replace(/2C (\d{2})(\d{4})(\d+)-(\d)/, "$1-$2-$3-$4").
                        * En el nodo persona_DNI, aplicar este regex: str.replace(/\./g, "").
                        * En el nodo persona_cuit, aplicar este regex: str.replace(/2C (\d{2})(\d{4})(\d+)-(\d)/, "$1-$2-$3-$4").
                        * En el nodo Pais, aplicar 2 o 3 caracteres para la identificación internacional.
                        * En los nodos fecha, aplicar el formato DD-MM-YYYY.
                        * Si una persona tiene más de un cargo, separarlos en entradas distintas dentro de "Persona_Cargo", por ejemplo:
                        "Persona_Cargo": [
                            {"p_rol": "Director titular", "permanece_en_cargo": "si"},
                            {"p_rol": "Presidente", "permanece_en_cargo": "si"}
                        ]
                    '
                ],
                [
                    "role" => "user",
                    "content" => $texto
                ]
            ],
            "tools" => [
                [
                    "type" => "function",
                    "function" => $functionSchema
                ]
            ],
            "tool_choice" => [
                "type" => "function",
                "function" => [
                    "name" => "completar_datos_edictos"
                ]
            ]
        ];


        $ch = curl_init('https://api.openai.com/v1/chat/completions');
        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($data));

        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            echo 'Error: ' . curl_error($ch);
        }
        curl_close($ch);
        $response = json_decode($response, true);
        dd(json_decode($response, true));
        $json = $response['choices'][0]['message']['tool_calls'][0]['function']['arguments'];
        dd(json_decode($json, true));
        echo json_encode(json_decode($response, true), JSON_PRETTY_PRINT);
    }

    public static function dataJsonStructure()
    {
        $apiKey = env('apiKey_chatgpt');

        $functionSchema = [
            "name" => "completar_datos_edictos",
            "description" => "Completa la estructura JSON de datos societarios",
            "parameters" => [
                "type" => "object",
                "properties" => [
                    "Datos_Empresa" => [
                        "type" => "object",
                        "properties" => [
                            "nombre_actual" => ["type" => "string"],
                            "nombre_anterior" => ["type" => "string"],
                            "cuit_empresa" => ["type" => "string"],
                            "domicilio_actual" => ["type" => "string"],
                            "domicilio_anterior" => ["type" => "string"],
                            "empresa_tipo" => ["type" => "string"]
                        ],
                        "required" => ["nombre_actual"]
                    ],
                    "Relacion_Personas" => [
                        "type" => "array",
                        "items" => [
                            "type" => "object",
                            "properties" => [
                                "apellido_nombre" => ["type" => "string"],
                                "persona_DNI" => ["type" => "string"],
                                "persona_cuit" => ["type" => "string"],
                                "persona_domicilio" => ["type" => "string"],
                                "persona_estado_civil" => ["type" => "string"],
                                "persona_conyuge_nombre" => ["type" => "string"],
                                "persona_conyuge_DNI" => ["type" => "string"],
                                "Persona_Cargo" => [
                                    "type" => "array",
                                    "items" => [
                                        "type" => "object",
                                        "properties" => [
                                            "p_rol" => ["type" => "string"],
                                            "permanece_en_cargo" => ["type" => "string"]
                                        ],
                                        "required" => ["p_rol", "permanece_en_cargo"],
                                    ]
                                ]
                            ]
                        ]
                    ],
                    "Relacion_Empresas" => [
                        "type" => "array",
                        "items" => [
                            "type" => "object",
                            "properties" => [
                                "Vinculada_nombre" => ["type" => "string"],
                                "Vinculada_cuit" => ["type" => "string"],
                                "Vinculada_Pais" => ["type" => "string"],
                                "Vinculada_domicilio" => ["type" => "string"],
                                "Vinculada_vinculo" => [
                                    "type" => "array",
                                    "items" => [
                                        "type" => "object",
                                        "properties" => [
                                            "e_rol" => ["type" => "string"]
                                        ],
                                        "required" => ["e_rol"]
                                    ]
                                ]
                            ]
                        ]
                    ],
                    "Datos_Generales" => [
                        "type" => "object",
                        "properties" => [
                            "tipo_edicto" => ["type" => "string"],
                            "fecha_asamblea" => [
                                "type" => "array",
                                "items" => ["type" => "string"]
                            ]
                        ],
                        "required" => ["tipo_edicto"]
                    ]
                ],
                "required" => [
                    "Datos_Empresa",
                    "Relacion_Personas",
                    "Relacion_Empresas",
                    "Datos_Generales"
                ]
            ]
        ];

        $texto = <<<TEXT
            EL NONO FIDEL PASTAS SAS FREYRE INSTRUMENTO CONSTITUTIVOEn la ciudad de Freyre Departamento San Justo de la Pro vincia de Cordoba Republica Argentina a los 21 dias de mayo de 2025 se reunen; 1 CLAUDIA ANA ALISSIO DN! N* 21554373 CUIT / CUIL N* 27215543736 nacido el dia 14/05/1970 es tado civil divorciado/a nacionalidad Argentina sexo Femenino de profesion Comerciante con domicilio real en Calle French Y Beruti 2267 ba rrio San Martin de la ciudad de San Francisco Departamento San Justo de la Provincia de Cor doba Argentina por derecho propio 2 JAVIER CARLOS ALISSIO 
            DNI N* 24844353 CUIT / CUILN* 20248443538 nacido el dia 15/11/1975 estado civil casado/a nacionalidad Argentina sexo 
            Masculino de profesion Comer ciante con domicilio real en Calle Jl De Cabrera 994 barrio Barrio Circunvalacion de la ciudad de Freyre 
            Departamento San Justo de la Pro vincia de Cordoba Argentina por derecho pro pio; quien/es resuelve/n: PRIMERO: Constituir una 
            sociedad por acciones simplificada denomi nada EL NONO FIDEL PASTAS SAS con sede social en Calle Papa Juan Xxiii 63 barrio Barrio 
            Centenario de la ciudad de Freyre De partamento San Justo de la Provincia de Cordo ba Republica Argentina SEGUNDO: El capital social es 
            de pesos Seiscientos Dieciseis Mil Cuatrocientos $61640000 representado por Cien 100 acciones de pesos Seis Mil Ciento Sesenta Y Cuatro 
            $616400 valor nominal cada una ordinarias nominativas no endosa bles de la clase B y con derecho a un voto por accion que se suscriben conforme 
            al siguiente detalle: 1 CLAUDIA ANA ALISSIO renuncia a su puesto de socia, suscribe la cantidad de Cincuenta 50 acciones por un total de pesos Trescientos Ocho Mil Doscientos 
            $308200 2 JAVIER CARLOS ALISSIO suscri be la cantidad de Cincuenta 50 acciones por un total de pesos Trescientos Ocho Mil Doscien tos $308200 
            El capital suscripto se integra en dinero en efectivo el veinticinco por ciento en este acto obligandose los/las accionistas a inte grar el saldo 
            dentro de los dos años desde la firma del presente instrumento TERCERO: Aprobar las siguientes clausulas por las que se regira la sociedad y que 
            a continuacion se trans criben: DENOMINACIONDOMICILIOPLAZO  OBJETO ARTICULO 1: La sociedad se deno minaEL NONO FIDEL PASTAS SASARTI CULO 2: 
            Tiene su domicilio social en jurisdiccion de la Provincia de Cordoba Republica Argentina; pudiendo establecer sucursales establecimien tos 
            agencias y domicilios especiales en cual quier parte del pais o del extranjero y fijarles o no un capital ARTICULO 3: La duracion de la socie dad 
            se establece en 99 años contados desde la fecha del instrumento constitutivo ARTICULO 4: La sociedad tiene por objeto realizar por cuenta propia 
            y/o de terceros o asociadas a terceros en el pais o en el extranjero las siguientes activida des: 1 Construccion de todo tipo de obras publi cas o 
            privadas edificios viviendas locales co merciales y plantas industriales; realizar refacciones remodelaciones instalaciones tra bajos de 
            albañileria y/o cualquier trabajo de la construccion 2 Transporte nacional o interna cional de cargas en general ya sea por via te rrestre aorea o 
            maritima con medios de trans porte propios o de terceros pudiendo realizar todo lo inherente a su logistica 3 Compra venta y permuta explotacion 
            arrendamientos y admi nistracion de bienes inmuebles urbanos y rura les y la realizacion de operaciones de propiedad horizontal 4 Realizar toda 
            clase de operaciones financieras por todos los medios autorizados por la legislacion vigente Se exceptuan las opera ciones comprendidas en la Ley de 
            Entidades Fi nanciera 5 Realizar la explotacion directa por si O por terceros en establecimientos rurales gana deros agricolas avicolas fruticolas 
            vitivinico las forestales cria venta y cruza de ganado explotacion de tambos cultivos compra venta y acopio de cereales 6 Elaboracion produccion 
            transformacion y comercializacion de productos y subproductos alimenticios de todo tipo expen dio de todo tipo de bebidas explotacion de servi 
            cio de catering de concesiones gastronomicas bares restoranes comedores organizacion y logistica en eventos sociales 7 Creacion pro  AIN TA ZAS 
            NS duccion elaboracion transformacion desarrollo reparacion implementacion servicio tocnico consultoria comercializacion distribucion im 
            portacion y exportacion de softwares equipos informaticos eloctricos y electronicos 8 Produc cion organizacion y explotacion de espectaculos 
            publicos y privados teatrales musicales coreo graficos desfiles exposiciones ferias concier tos musicales recitales y eventos sociales 9 
            Explotacion de agencia de viajes y turismo pu diendo realizar reservas y ventas de pasajes terrestres aoreos maritimos nacionales o inter 
            nacionales; organizacion reserva y ventas de excursiones reservas de hoteleria reserva or ganizacion y ventas de charters y traslados den t
            ro y fuera del pais de contingentes 10 Organi zacion administracion gerenciamiento y explotacion de centros modicos asistenciales con atenc
            ion polivalente e integral de medicina atencion clinica terapoutica y quirurgica con o sin internacion y demas actividades relaciona das a 
            la salud y servicios de atencion modica 11 Constituir instalar y comercializar editoriales y graficas en cualquier soporte 12 Instalacion y 
            explotacion de establecimientos destinados a la industrializacion fabricacion y elaboracion de las materias primas productos y subproductos 
            relacionados directamente con su objeto social 13 Importacion y exportacion de bienes y servi cios 14 Actuar como fiduciante fiduciaria be 
            neficiaria fideicomisaria por cuenta propia o por cuenta de terceros y/o asociada a terceros en todo tipo de emprendimientos A tales fines 
            la sociedad tiene plena capacidad juridica para ad quirir derechos y contraer obligaciones con las limitaciones impuestas por las leyes y el 
            presen te instrumento CAPITALACCIONES ARTICU LO 5: El capital social es de pesos Seiscientos Dieciseis Mil Cuatrocientos $61640000 re 
            presentado por Cien 100 acciones de pesos Seis Mil Ciento Sesenta Y Cuatro $616400 valor nominal cada una ordinarias nominativas no endosables de la clase B y con derecho a un voto por accion El capital social puede ser aumentado conforme a lo previsto por el art 44 de la Ley 27349 ARTICULO 6: Las acciones que se emitan podran ser ordinarias nominativas no endosables escriturales o preferidas Las ac ciones ordinarias pueden ser: de clase A' que confieren derecho a cinco votos por accion y de la clase B que confieren derecho a un voto por accion Las acciones preferidas tendran derecho a un dividendo de pago preferente de caracter acumulativo o no conforme a las condiciones de emision tambion podran fijarseles una participa cion adicional en las ganancias Las acciones que se emitan deberan indicar su valor nominal y los derechos economicos y politicos reconoci dos a cada clase conforme art 46 Ley 27349 ADMINISTRACIONREPRESENTACIONUSO DE FIRMA ARTICULO 7: La administracion estara a cargo de: JAVIER CARLOS ALISSIO DNI N* 24844353 en el caracter de adminis trador/a titular En el desempeño de sus funcio nes y actuando en forma individual o colegiada segun el caso tienen todas las facultades para realizar los actos y contratos tendientes al cum plimiento del objeto social y durara/n en su/sus cargo/s mientras no cometan actos que sean pa sibles de remocion por justa causa En este mis mo acto se designa a: CLAUDIA ANA ALISSIO DNI N* 21554373 en el caracter de adminis trador/a suplente con el fin de llenar la vacante que pudiera producirse Las personas menciona das presentes en este acto aceptan en forma expresa la designacion propuesta respectiva mente bajo responsabilidad de ley se notifican del tiempo de duracion de los mismos y mani fiestan con caracter de declaracion jurada que no les comprenden las prohibiciones e incompa tibilidades de ley ARTICULO 8: La representa cion y uso de la firma social estara a cargo del Sr/Sra JAVIER CARLOS ALISSIO DNI N* 24844353 en caso de ausencia o impedimento correspondera a la reunion de socios o en su caso al socio unico la designacion de su reem plazante Durara en su cargo mientras no sea removido por justa causa REUNION DE SO CIOS ARTICULO 9: Todas las resoluciones so ciales de la sociedad se asentaran en un libro de Actas que se llevara a tales efectos y las disposi ciones se tomaran en un todo de acuerdo a lo prescripto por el art 53 de la Ley 27349 y con cordantes de la Ley 19550 De las deliberacio nes del organo de gobierno deberan labrarse actas las que resumiran las manifestaciones efectuadas el sentido de las votaciones y su re sultado con expresion completa de las decisio nes adoptadas El quorum para cualquier reu nion se forma con la presencia de los/las accionistas que representen mas de la mitad del capital social Las decisiones sociales que tien dan a introducir modificaciones en el contrato social deben ser tomadas por decisiones de mas de la mitad del capital social Las resoluciones sociales que no conciernen a la modificacion del contrato la designacion o revocacion de admi nistradores o representantes se adoptaran por mayoria del capital presente en la reunion FIS CALIZACION ARTICULO 10: La sociedad pres cinde de organo de fiscalizacion adquiriendo los accionistas las facultades de contralor conforme al Art 55 Ley 19550 BALANCEDISTRIBU CION DE UTILIDADES ARTICULO 11: El ejerci cio social cierra el dia 31 de Diciembre de cada año A esa fecha se confeccionaran los estados contables conforme a las disposiciones en vi gencia y normas tocnicas de la materia ARTI CULO 12: Las ganancias realizadas y liquidas se destinaran: a el cinco por ciento hasta alcanzar el veinte por ciento del capital suscripto para el fondo de la reserva legal b la remuneracion del organo de administracion y representacion en su caso c a reservas facultativas conforme lo previsto en el articulo 70 in fine de la Ley 19550 d a dividendos de las acciones preferidas y con prioridad los acumulativos impagos e a dividen do de acciones ordinarias f el saldo al destino que fije la reunion de socios/as ARTICULO 13: Los dividendos deberan ser pagados en propor cion a las respectivas integraciones dentro del ejercicio en que fueron aprobados DISOLU CIONLIQUIDACION ARTICULO 14: Disuelta la sociedad por cualquiera de las causales previs tas por el articulo 94 de la Ley 19550 la liquida cion sera practicada por la o las personas desig nadas como liquidadores/as por el organo de gobierno quienes deberan actuar conforme a lo dispuesto en los articulos 101 siguientes y con cordantes de la Ley19550 Las personas nom bradas en este acto JAVIER CARLOS ALISSIO con domicilio especial en Calle J L De Cabrera 994 barrio Barrio Circunvalacion de la ciudad de Freyre Departamento San Justo de la Pro vincia de Cordoba Republica Argentina CLAU DIA ANA ALISSIO con domicilio especial en Calle French Y Beruti 2267 barrio San Martin de la ciudad de San Francisco Departamento San Justo de la Provincia de Cordoba Republica Ar gentina y el Sr Representante JAVIER CARLOS ALISSIO con domicilio especial en Calle Jl De Cabrera 994 barrio Barrio Circunvalacion de la ciudad de Freyre Departamento San Justo de la Provincia de Cordoba Republica Argentina aceptan en forma expresa la designacion pro puesta respectivamente bajo responsabilidad de ley se notifican del tiempo de duracion de los mismos y manifiestan con caracter de declara cion jurada que no les comprenden las prohibi ciones e incompatibilidades de ley Con lo que finaliza el acta en el lugar y fecha consignados al comienzo del acto autorizando expresamente a los/las administradores/as a obligar a la socie dad respecto de los actos necesarios para su constitucion y a realizar los actos propios de la explotacion del objeto social durante el periodo fundacional Una vez inscripta la sociedad las obligaciones emergentes seran asumidas de pleno derecho por la sociedad teniondose como originariamente cumplidos por osta y liberando a los/las accionistas y al organo de administracion de toda responsabilidad Autorizar a JAVIER CARLOS ALISSIO DNI N* 24844353 CUIT/ CUIL N* 20 248443538 con domicilio legal  constituido en Calle Papa Juan Xxiii 63 Provin cia de Cordoba para que realicen todos los tra mites necesarios para lograr la conformidad ad ministrativa y la inscripcion en el Registro Publico del presente instrumento facultandolos/as para presentar y retirar documentacion realizar depo sitos bancarios y extraerlos aceptar las observa ciones que formule la Direccion General de Per sonas Juridicas y proceder con arreglo a ellas y en su caso para interponer los recursos que las leyes establecen JAVIER CARLOS ALISSIOSOCIO / ADMINISTRADOR TITULAR / REPRE SENTANTE FIRMA Y ACLARACIONCLAUDIA ANA ALISSIOSOCIA / ADMINISTRADORA SUPLENTE 1 dia  N* 599436  $ 84721  23/5/2025  BOE
        TEXT;

        $data = [
            "model" => "gpt-4o",
            "messages" => [
                [
                    "role" => "system",
                    "content" => "Completá la estructura JSON societaria a partir del texto del edicto, sin inventar datos."
                ],
                [
                    "role" => "assistant",
                    "content" => <<<RULES
                        
                        * Evita títulos y explicaciones.
                        * Respetar la estructura JSON solicitada.
                        * No inventar datos. Sólo informar los contenidos en el Edicto.
                        * No incluyas claves con valores nulos.
                        * No incluyas claves con valor "No disponible" o "Null".
                        * Valores como SA, S.A., SRL, S.R.L., SL, S.L., SAS, INC, LLC son referidos a empresa_tipo.
                        * En Datos_Empresa, NO informar cuit_empresa si comienza con "2".
                        * En el nodo persona_estado_civil, indicar si es casado/a o soltero/a solo si esta información está disponible. En caso de indicar con quien esta casado/a, agregar el nodo persona_conyuge con el nombre de la persona.
                        * En persona_cargo:
                        ** Considera los cargos de “Presidente”, “Gerente”, “Director”, “Director Titular”, “Director Suplente”, “Apoderado”, “Socio”, por su rol DENTRO de la empresa.
                        ** El formato debe ser: "Persona_Cargo": [{"p_rol": " ", "permanece_en_cargo": "si/no"}]
                        * En el nodo permanece_en_cargo, indicar:
                        - "no" cuando la persona falleció, renunció, cesó o fue removida de su cargo.
                        - "si" en todos los demás casos (incluso si no se menciona expresamente).
                        * En Vinculada_vinculo:
                        ** Considera la vinculación de “Socio”, “Relacionadas”, “Controladas”, “Controlantes”, por su rol DENTRO de la empresa.
                        ** El formato debe ser: "Vinculada_vinculo": [{"e_rol": " "}]
                        ** Cada rol debe expresarse de forma separada.
                        * En el nodo tipo_edicto indicar el objeto principal del edicto.
                        * En el nodo cuit_empresa, aplicar este regex: str.replace(/2C (\d{2})(\d{4})(\d+)-(\d)/, "$1-$2-$3-$4").
                        * En el nodo persona_DNI, aplicar este regex: str.replace(/\./g, "").
                        * En el nodo persona_cuit, aplicar este regex: str.replace(/2C (\d{2})(\d{4})(\d+)-(\d)/, "$1-$2-$3-$4").
                        * En el nodo Pais, aplicar 2 o 3 caracteres para la identificación internacional.
                        * En los nodos fecha, aplicar el formato DD-MM-YYYY.
                        * Si una persona tiene más de un cargo, separarlos en entradas distintas dentro de "Persona_Cargo", por ejemplo:
                        "Persona_Cargo": [
                            {"p_rol": "Director titular", "permanece_en_cargo": "si"},
                            {"p_rol": "Presidente", "permanece_en_cargo": "si"}
                        ]
                    
                    RULES
                ],
                [
                    "role" => "user",
                    "content" => $texto
                ]
            ],
            "tools" => [
                [
                    "type" => "function",
                    "function" => $functionSchema
                ]
            ],
            "tool_choice" => [
                "type" => "function",
                "function" => [
                    "name" => "completar_datos_edictos"
                ]
            ]
        ];

        $ch = curl_init('https://api.openai.com/v1/chat/completions');
        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($data));

        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            echo 'Error: ' . curl_error($ch);
            return;
        }
        curl_close($ch);

        $response = json_decode($response, true);

        if (isset($response['choices'][0]['message']['tool_calls'][0]['function']['arguments'])) {
            $json = $response['choices'][0]['message']['tool_calls'][0]['function']['arguments'];
            $decoded = json_decode($json, true);
            dd($decoded);
        } else {
            dd($response); // fallback para debug
        }
    }


}