<?php
declare(strict_types=1);

namespace Celena\Core\Ai;

use Celena\Core\Ai\Provider\AnthropicProvider;
use Celena\Core\Ai\Provider\OpenAiProvider;
use Celena\Module\Settings\Options;
use RuntimeException;

/**
 * Фасад ИИ-интеграции. Выбирает провайдера по настройкам и выполняет задачи.
 * Ключи провайдеров хранит Options (Настройки → ИИ).
 */
final class AiManager
{
    /** @var array<string, callable(array $args):string> */
    private array $tasks = [];

    public function __construct(private readonly Options $options)
    {
        $this->registerBuiltinTasks();
    }

    public function provider(?string $name = null): ProviderInterface
    {
        $name = $name ?? (string) $this->options->get('ai_provider', 'anthropic');
        $key = (string) $this->options->get('ai_' . $name . '_key', '');
        if ($key === '') {
            throw new RuntimeException("API-ключ для '$name' не задан. Настройте в Настройки → ИИ.");
        }
        return match ($name) {
            'anthropic' => new AnthropicProvider($key, (string) $this->options->get('ai_anthropic_model', 'claude-sonnet-4-6')),
            'openai'    => new OpenAiProvider($key, (string) $this->options->get('ai_openai_model', 'gpt-4o-mini')),
            default     => throw new RuntimeException("Unknown provider: $name"),
        };
    }

    public function registerTask(string $name, callable $handler): void
    {
        $this->tasks[$name] = $handler;
    }

    public function run(string $task, array $args = []): string
    {
        if (!isset($this->tasks[$task])) {
            throw new RuntimeException("Unknown AI task: $task");
        }
        return ($this->tasks[$task])($args);
    }

    public function hasTask(string $task): bool
    {
        return isset($this->tasks[$task]);
    }

    /** @return string[] */
    public function tasks(): array { return array_keys($this->tasks); }

    private function registerBuiltinTasks(): void
    {
        $this->tasks['generate_meta'] = function (array $args): string {
            $title = (string) ($args['title'] ?? '');
            $content = mb_substr((string) ($args['content'] ?? ''), 0, 4000, 'UTF-8');
            $result = $this->provider()->complete(
                system: 'Ты SEO-специалист. Сгенерируй JSON с ключами seo_title (до 60 символов), seo_description (до 160 символов), keywords (5-10 через запятую) на том же языке, что и контент. Верни ТОЛЬКО валидный JSON, без пояснений.',
                user: "Заголовок: $title\n\nКонтент:\n$content",
                opts: ['max_tokens' => 400, 'temperature' => 0.3],
            );
            return $result;
        };

        $this->tasks['translate'] = function (array $args): string {
            $text = (string) ($args['text'] ?? '');
            $to = (string) ($args['to'] ?? 'en');
            return $this->provider()->complete(
                system: "Ты профессиональный переводчик. Переведи текст на язык '$to'. Верни ТОЛЬКО перевод, сохраняя форматирование Markdown.",
                user: $text,
                opts: ['max_tokens' => 2000, 'temperature' => 0.2],
            );
        };

        $this->tasks['rewrite'] = function (array $args): string {
            $text = (string) ($args['text'] ?? '');
            $tone = (string) ($args['tone'] ?? 'нейтральный');
            return $this->provider()->complete(
                system: "Перепиши текст в тоне '$tone', сохранив смысл и форматирование Markdown. Верни только переписанный текст.",
                user: $text,
                opts: ['max_tokens' => 2000, 'temperature' => 0.7],
            );
        };

        $this->tasks['summarize'] = function (array $args): string {
            $text = (string) ($args['text'] ?? '');
            $max = (int) ($args['max_length'] ?? 200);
            return $this->provider()->complete(
                system: "Сделай краткое описание (до $max символов) для новости/страницы. Верни только текст, без кавычек и пояснений.",
                user: $text,
                opts: ['max_tokens' => 300, 'temperature' => 0.3],
            );
        };

        $this->tasks['generate_slug'] = function (array $args): string {
            $title = (string) ($args['title'] ?? '');
            return $this->provider()->complete(
                system: 'Сгенерируй короткий ЧПУ-slug из заголовка: латиница, цифры, дефисы, до 60 символов. Верни ТОЛЬКО slug.',
                user: $title,
                opts: ['max_tokens' => 60, 'temperature' => 0.1],
            );
        };

        $this->tasks['generate_article'] = function (array $args): string {
            $title = (string) ($args['title'] ?? '');
            $hint  = (string) ($args['hint'] ?? '');
            $system = 'Ты опытный редактор. Напиши полную, информативную, живую статью для сайта на том же языке, '
                    . 'что и заголовок. Структура: вступление, 3–5 смысловых подзаголовков с абзацами, вывод. '
                    . 'Форматируй результат как HTML: <p>, <h2>, <h3>, <ul>/<li>, <strong>, <em>, <blockquote>. '
                    . 'Не добавляй <html>/<head>/<body>. Не пиши \"вот статья:\" — верни только сам HTML.';
            $user = "Заголовок: $title";
            if ($hint !== '') {
                $user .= "\n\nКраткая подсказка / тезисы:\n$hint";
            }
            return $this->provider()->complete(
                system: $system,
                user: $user,
                opts: ['max_tokens' => 3000, 'temperature' => 0.7],
            );
        };
    }
}
