<?php

declare(strict_types=1);

namespace App\Services;

final class AiClient
{
    public function improveReport(string $citizenText, array $context = []): array
    {
        $citizenText = trim($citizenText);

        if (config('ai.api_key')) {
            $response = $this->chat([
                ['role' => 'system', 'content' => 'Ти си юридически и административен помощник за български граждани. Пиши ясно, без да измисляш факти. Върни кратък JSON с keys: questions, institution, legal_references, official_text, next_actions.'],
                ['role' => 'user', 'content' => json_encode(['text' => $citizenText, 'context' => $context], JSON_UNESCAPED_UNICODE)],
            ]);

            $decoded = json_decode($response, true);
            if (is_array($decoded)) {
                return $decoded;
            }
        }

        $institution = $this->guessInstitution($citizenText);

        return [
            'questions' => [
                'Къде точно се намира проблемът?',
                'От кога съществува?',
                'Има ли непосредствен риск за хора или автомобили?',
            ],
            'institution' => $institution,
            'legal_references' => [
                'Административнопроцесуален кодекс - право на сигнал и отговор в срок.',
                'Закон за местното самоуправление и местната администрация - компетентност на общината.',
            ],
            'official_text' => "До: {$institution}\n\nОтносно: Сигнал за проблем в градската среда\n\nУважаеми госпожи и господа,\n\nПодавам настоящия сигнал във връзка със следния проблем: {$citizenText}\n\nМоля да бъде извършена проверка и да бъдат предприети необходимите действия по компетентност. Моля да бъда уведомен за резултата и предприетите мерки в законоустановения срок.\n\nДата: " . date('d.m.Y') . "\nПодпис: ............",
            'next_actions' => [
                'Добави точен адрес и снимки.',
                'Изпрати сигнала към препоръчаната институция.',
                'Запази входящ номер и следи срока за отговор.',
            ],
        ];
    }

    private function chat(array $messages): string
    {
        $payload = json_encode([
            'model' => config('ai.model'),
            'messages' => $messages,
            'temperature' => 0.2,
            'response_format' => ['type' => 'json_object'],
        ], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);

        $context = stream_context_create([
            'http' => [
                'method' => 'POST',
                'header' => [
                    'Content-Type: application/json',
                    'Authorization: Bearer ' . config('ai.api_key'),
                ],
                'content' => $payload,
                'timeout' => config('ai.timeout', 25),
                'ignore_errors' => true,
            ],
        ]);

        $raw = file_get_contents(config('ai.base_url') . '/chat/completions', false, $context);
        $decoded = json_decode((string) $raw, true);

        return (string) ($decoded['choices'][0]['message']['content'] ?? '');
    }

    private function guessInstitution(string $text): string
    {
        $lower = \u_lower($text);

        return match (true) {
            str_contains($lower, 'замърся') || str_contains($lower, 'отпад') => 'РИОСВ / Община по местонахождение',
            str_contains($lower, 'потреб') || str_contains($lower, 'магазин') => 'Комисия за защита на потребителите',
            str_contains($lower, 'шум') => 'Община / МВР по компетентност',
            str_contains($lower, 'път') || str_contains($lower, 'дупка') || str_contains($lower, 'тротоар') => 'Община по местонахождение',
            default => 'Компетентната общинска администрация',
        };
    }
}
