<?php

namespace App\Livewire;

use App\Services\NunaAssistantService;
use Livewire\Component;

class NunaAssistant extends Component
{
    public bool   $isOpen        = false;
    public string $input         = '';
    public array  $messages      = [];
    public ?array $pendingIntent = null;

    public function toggleOpen(): void
    {
        $this->isOpen = ! $this->isOpen;
    }

    public function send(): void
    {
        $command = trim($this->input);
        if (! $command) return;

        // Si hay un intent pendiente, cancelarlo antes de continuar
        if ($this->pendingIntent) {
            $this->pendingIntent = null;
        }

        $this->messages[] = ['role' => 'user', 'content' => $command];
        $this->input      = '';

        $this->dispatch('nuna-scroll-bottom');
        $this->processCommand($command);
    }

    private function processCommand(string $command): void
    {
        $result = app(NunaAssistantService::class)
            ->interpret($command, $this->buildApiHistory());

        if ($result['type'] === 'intent') {
            $this->pendingIntent = $result;
            $this->messages[] = [
                'role'    => 'assistant',
                'type'    => 'intent',
                'content' => $result['display']['title'],
                'display' => $result['display'],
            ];
        } elseif ($result['type'] === 'error') {
            $this->messages[] = ['role' => 'assistant', 'type' => 'error', 'content' => $result['message']];
        } else {
            // Respuesta de texto (incluye preguntas de aclaración de Claude)
            $this->messages[] = ['role' => 'assistant', 'type' => 'text', 'content' => $result['message'] ?? 'No entendí el comando.'];
        }

        $this->dispatch('nuna-scroll-bottom');
    }

    public function confirm(): void
    {
        if (! $this->pendingIntent) return;

        $result = app(NunaAssistantService::class)
            ->execute($this->pendingIntent['tool'], $this->pendingIntent['input']);

        // Reemplazar el intent card con el resultado
        array_pop($this->messages);
        $this->messages[] = [
            'role'    => 'assistant',
            'type'    => $result['type'] ?? 'text',
            'content' => $result['message'] ?? 'Listo.',
        ];

        $this->pendingIntent = null;

        if (($result['type'] ?? '') === 'success') {
            $this->dispatch('nuna-refresh');
        }

        $this->dispatch('nuna-scroll-bottom');
    }

    public function cancel(): void
    {
        if ($this->pendingIntent) {
            // Reemplazar el intent card con mensaje de cancelación
            array_pop($this->messages);
            $this->messages[] = [
                'role'    => 'assistant',
                'type'    => 'text',
                'content' => '❌ Acción cancelada. ¿En qué más puedo ayudarte?',
            ];
        }
        $this->pendingIntent = null;
        $this->dispatch('nuna-scroll-bottom');
    }

    public function clearChat(): void
    {
        $this->messages      = [];
        $this->pendingIntent = null;
        $this->input         = '';
    }

    /**
     * Construye el historial para la API de Claude a partir de los mensajes de display.
     * Solo incluye mensajes de usuario y respuestas de texto del asistente (no intents/success/error).
     * Excluye el último mensaje (el actual que se está procesando).
     */
    private function buildApiHistory(): array
    {
        $history = [];
        // Todos menos el último (que es el comando actual recién agregado)
        $msgs = array_slice($this->messages, 0, -1);

        foreach ($msgs as $msg) {
            if ($msg['role'] === 'user') {
                $history[] = ['role' => 'user', 'content' => $msg['content']];
            } elseif ($msg['role'] === 'assistant') {
                $type = $msg['type'] ?? 'text';
                if ($type === 'text') {
                    // Respuesta conversacional de Claude (aclaraciones, etc.)
                    $history[] = ['role' => 'assistant', 'content' => $msg['content']];
                } elseif ($type === 'intent') {
                    // Intent que mostró — lo convertimos a texto para el contexto
                    $history[] = ['role' => 'assistant', 'content' => 'Propuse: ' . $msg['content']];
                }
                // Ignoramos 'success' y 'error' de tool execution (el page reload los limpia de todas formas)
            }
        }

        return $history;
    }

    public function render()
    {
        return view('livewire.nuna-assistant');
    }
}
