<?php

namespace App\Filament\Tenant\Pages;

use App\Models\Tenant\AiChat;
use App\Services\Ai\AiAssistantService;
use App\Tenancy\TenantManager;
use Filament\Pages\Page;
use Livewire\Attributes\Url;

class AiAssistant extends Page
{
    protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-sparkles';

    protected static ?string $navigationLabel = 'Asistent AI';

    protected static string|\UnitEnum|null $navigationGroup = 'Analiză';

    protected static ?int $navigationSort = 71;

    protected static ?string $title = 'Asistent AI';

    protected string $view = 'filament.tenant.pages.ai-assistant';

    public ?int $chatId = null;

    public string $newMessage = '';

    public bool $loading = false;

    public function mount(): void
    {
        // Use last chat for the user, or create a new one.
        $userId = auth()->id();
        $companyId = app(TenantManager::class)->currentId();
        if (! $userId || ! $companyId) return;

        $chat = AiChat::where('user_id', $userId)->latest('updated_at')->first();
        if (! $chat) {
            $chat = AiChat::create([
                'company_id' => $companyId,
                'user_id' => $userId,
                'title' => 'Conversație nouă',
                'provider' => $this->defaultProvider(),
            ]);
        }
        $this->chatId = $chat->id;
    }

    public function getChat(): ?AiChat
    {
        return $this->chatId ? AiChat::with('messages')->find($this->chatId) : null;
    }

    public function getChats()
    {
        return AiChat::where('user_id', auth()->id())
            ->latest('updated_at')
            ->limit(20)
            ->get();
    }

    public function getUsage(): array
    {
        return app(AiAssistantService::class)->monthlyUsage();
    }

    public function newChat(): void
    {
        $chat = AiChat::create([
            'company_id' => app(TenantManager::class)->currentId(),
            'user_id' => auth()->id(),
            'title' => 'Conversație nouă',
            'provider' => $this->defaultProvider(),
        ]);
        $this->chatId = $chat->id;
        $this->newMessage = '';
    }

    public function selectChat(int $id): void
    {
        $chat = AiChat::where('user_id', auth()->id())->where('id', $id)->first();
        if ($chat) $this->chatId = $chat->id;
    }

    public function deleteChat(int $id): void
    {
        AiChat::where('user_id', auth()->id())->where('id', $id)->delete();
        if ($this->chatId === $id) {
            $this->chatId = AiChat::where('user_id', auth()->id())->latest('updated_at')->value('id');
            if (! $this->chatId) $this->newChat();
        }
    }

    public function send(): void
    {
        $msg = trim($this->newMessage);
        if ($msg === '' || ! $this->chatId) return;

        $this->loading = true;
        $this->newMessage = '';
        $chat = AiChat::find($this->chatId);
        if (! $chat) { $this->loading = false; return; }

        try {
            app(AiAssistantService::class)->ask($chat, $msg);
        } finally {
            $this->loading = false;
        }
    }

    protected function defaultProvider(): string
    {
        $tenant = app(TenantManager::class)->current();
        return ($tenant?->settings['ai']['default_provider'] ?? 'claude');
    }
}
