<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\DB;
use App\Services\AISchema;

class ChatController extends Controller
{
    private function callDeepSeek($messages, $temperature = 0.1)
    {
        $apiKey = env("DEEPSEEK_API_KEY");
        $url = "https://api.deepseek.com/chat/completions";

        $response = Http::withHeaders([
            "Authorization" => "Bearer $apiKey",
            "Content-Type" => "application/json"
        ])->timeout(60)->post($url, [
            "model" => "deepseek-reasoner",
            "messages" => $messages,
            "temperature" => $temperature,
            "max_tokens" => 2000
        ]);

        if ($response->failed()) {
            throw new \Exception("Error llamando a DeepSeek: " . ($response->json()['error']['message'] ?? 'Desconocido'));
        }

        return $response->json()["choices"][0]["message"]["content"] ?? "";
    }

    public function ask(Request $request)
    {
        $userQuestion = $request->input("message");
        $history = $request->input("history", []);
        
        if (!$userQuestion) {
            return response()->json(["reply" => "Por favor escribe una pregunta."]);
        }

        $currentDate = date('Y-m-d H:i:s');
        $schema = AISchema::getSchema();

        // Formatear historial
        $historyFormatted = [];
        foreach (array_slice($history, -14) as $msg) {
            $historyFormatted[] = [
                "role" => ($msg['role'] == 'user') ? 'user' : 'assistant',
                "content" => $msg['content']
            ];
        }

        // PASO 1: Text to SQL
        $sqlPrompt = "System: Tu nombre es Dra. Sophia. Estás operando en el 'MODO IA: ANÁLISIS CLÍNICO'.
        Eres experta en PostgreSQL. FECHA ACTUAL: $currentDate
        
        $schema
        
        Instrucción: 
        1. Si la pregunta es saludo/casual, responde amablemente empezando con 'CHAT: '.
        2. Si requiere datos, responde SOLO con el código SQL puro. SIN markdown.
        
        Pregunta actual: \"$userQuestion\"";

        try {
            $messagesSQL = array_merge($historyFormatted, [["role" => "user", "content" => $sqlPrompt]]);
            $rawResponse = $this->callDeepSeek($messagesSQL, 0);
            
            if (str_starts_with(trim($rawResponse), 'CHAT:')) {
                return response()->json(["reply" => str_replace('CHAT:', '', $rawResponse)]);
            }

            $generatedSQL = trim(str_replace(["```sql", "```", "sql"], "", $rawResponse));

        } catch (\Exception $e) {
            return response()->json(["reply" => "Error de comunicación: " . $e->getMessage()]);
        }

        // PASO 2: Ejecutar SQL
        try {
            if (empty($generatedSQL)) throw new \Exception("SQL vacío");
            $results = DB::connection("pgsql_readonly")->select($generatedSQL);
        } catch (\Exception $e) {
            return response()->json(["reply" => "No pude encontrar esa información específica. ¿Deseas consultar algo más?"]);
        }

        if (empty($results)) {
            return response()->json(["reply" => "No encontré información relacionada en la base de datos para esa consulta."]);
        }

        // PASO 3: Informe Médico
        $dataContext = substr(json_encode($results), 0, 10000);
        
        $summaryPrompt = "CONTEXTO: Eres la Dra. Sophia, analista de la clínica.
        DATOS DE DB: $dataContext
        PREGUNTA: $userQuestion
        
        INSTRUCCIÓN: 
        - Sé DIRECTA. Sin saludos repetitivos.
        - Si es historial médico, redacta un INFORME PROFESIONAL (RN = Recién Nacido).
        - FIDELIDAD: No inventes nada.";

        try {
            $finalReply = $this->callDeepSeek([["role" => "user", "content" => $summaryPrompt]], 0.3);

        } catch (\Exception $e) {
            $finalReply = "Tengo los datos pero hubo un problema al procesarlos. Intenta preguntar algo más específico.";
        }

        return response()->json([
            "reply" => $finalReply,
            "sql_used" => $generatedSQL 
        ]);
    }
}
