<?php
namespace EasyChat\Library\Support;







final class OfficialProductMatrixPolicy {
    private const CAPABILITIES = [
        'desktop_app' => [
            'ru' => [
                'fact' => 'Отдельного Desktop-приложения EasyChat для Windows, macOS или Linux сейчас нет. На компьютере оператор работает в web-админке через браузер, а отдельное приложение доступно для Android.',
                'fallback' => 'Отдельного Desktop-приложения EasyChat сейчас нет. На компьютере можно работать в web-админке через браузер, а отдельное приложение доступно для Android.',
                'title' => 'Вход оператора: браузер, iPhone и Android',
                'section' => 'Способы работы оператора',
                'url' => 'https://docs.easychat24.ru/docs/operator-access/',
            ],
            'en' => [
                'fact' => 'EasyChat does not currently provide a separate desktop app for Windows, macOS or Linux. Operators use the web admin panel in a browser on a computer, while a dedicated app is available for Android.',
                'fallback' => 'EasyChat does not currently have a separate desktop app. Operators can use the web admin panel in a browser on a computer, and a dedicated Android app is available.',
                'title' => 'Operator sign-in: browser, iPhone and Android',
                'section' => 'Operator access options',
                'url' => 'https://docs.easychat24.ru/en/docs/operator-access/',
            ],
        ],
    ];

    private const PLATFORMS = [
        'bitrix' => [
            'ru' => ['name' => '1С-Битрикс', 'kind' => 'модуль', 'url' => 'https://docs.easychat24.ru/docs/platforms/bitrix/'],
            'en' => ['name' => '1C-Bitrix', 'kind' => 'module', 'url' => 'https://docs.easychat24.ru/en/docs/platforms/bitrix/'],
        ],
        'opencart' => [
            'ru' => ['name' => 'OpenCart', 'kind' => 'модуль', 'url' => 'https://docs.easychat24.ru/docs/platforms/opencart/'],
            'en' => ['name' => 'OpenCart', 'kind' => 'module', 'url' => 'https://docs.easychat24.ru/en/docs/platforms/opencart/'],
        ],
        'wordpress' => [
            'ru' => ['name' => 'WordPress/WooCommerce', 'kind' => 'плагин', 'url' => 'https://docs.easychat24.ru/docs/platforms/wordpress/'],
            'en' => ['name' => 'WordPress/WooCommerce', 'kind' => 'plugin', 'url' => 'https://docs.easychat24.ru/en/docs/platforms/wordpress/'],
        ],
        'webasyst' => [
            'ru' => ['name' => 'Webasyst/Shop-Script', 'kind' => 'плагин', 'url' => 'https://docs.easychat24.ru/docs/platforms/webasyst/'],
            'en' => ['name' => 'Webasyst/Shop-Script', 'kind' => 'plugin', 'url' => 'https://docs.easychat24.ru/en/docs/platforms/webasyst/'],
        ],
        'generic' => [
            'ru' => ['name' => 'обычного PHP-сайта', 'kind' => 'универсальный пакет', 'url' => 'https://docs.easychat24.ru/docs/platforms/universal-installation/'],
            'en' => ['name' => 'a regular PHP website', 'kind' => 'universal package', 'url' => 'https://docs.easychat24.ru/en/docs/platforms/universal-installation/'],
        ],
    ];

    public function match(string $question, string $locale): ?array {
        $normalized = mb_strtolower(trim($question), 'UTF-8');
        if ($normalized === '' || $this->isCommercialIntent($normalized)) return null;
        $locale = $locale === 'en' ? 'en' : 'ru';
        $capability = $this->capability($normalized);
        if ($capability !== '' && isset(self::CAPABILITIES[$capability])) {
            return array_merge(
                ['type' => 'capability', 'capability' => $capability, 'locale' => $locale, 'deterministic' => true],
                self::CAPABILITIES[$capability][$locale]
            );
        }
        if (!$this->isAvailabilityIntent($normalized)) return null;
        $platform = $this->platform($normalized);
        if ($platform === '' || !isset(self::PLATFORMS[$platform])) return null;
        return array_merge(['type' => 'platform', 'platform' => $platform, 'locale' => $locale], self::PLATFORMS[$platform][$locale]);
    }

    public function systemEvidence(array $match): string {
        if (($match['type'] ?? '') === 'capability') {
            if (($match['locale'] ?? 'ru') === 'en') {
                return "\n\nTRUSTED PRODUCT FACT: {$match['fact']} Answer the user's question directly and naturally in one or two concise sentences. Lead with yes or no when appropriate, then give the practical alternative. Do not ask a clarifying question or add unsupported details.";
            }
            return "\n\nДОВЕРЕННЫЙ ФАКТ О ПРОДУКТЕ: {$match['fact']} Ответьте на вопрос прямо и естественно одним-двумя короткими предложениями. Если уместно, начните с «да» или «нет», затем назовите практичную альтернативу. Не задавайте уточняющий вопрос и не добавляйте неподтверждённые детали.";
        }
        if (($match['locale'] ?? 'ru') === 'en') {
            return "\n\nTRUSTED PRODUCT MATRIX: EasyChat has an official {$match['kind']} for {$match['name']}. Answer in one short sentence using only this fact. Do not mention prices, marketplaces, typical features, compatibility or installation details.";
        }
        return "\n\nДОВЕРЕННАЯ МАТРИЦА ПРОДУКТА: для {$match['name']} у EasyChat есть официальный {$match['kind']}. Ответьте одним коротким предложением, используя только этот факт. Не упоминайте цены, магазины приложений, типичные возможности, совместимость или детали установки.";
    }

    public function finalize(string $model_answer, array $match): array {
        $answer = preg_replace('/\[S?\d+(?:\s*,\s*S?\d+)*\]/i', '', $model_answer);
        $answer = preg_replace('/\[([^\]]+)\]\(https?:\/\/[^)\s]+\)/i', '$1', (string)$answer);
        $answer = preg_replace('/https?:\/\/[^\s<>()]+/i', '', (string)$answer);
        $answer = preg_split('/\R\s*\R/u', (string)$answer, 2)[0] ?? '';
        $answer = trim(mb_substr(preg_replace('/[ \t]+/u', ' ', (string)$answer), 0, 1200, 'UTF-8'));
        if ($answer === '') $answer = $this->fallbackAnswer($match);
        $source = [
            'id' => 'S1',
            'title' => (string)($match['title'] ?? (($match['locale'] ?? 'ru') === 'en' ? 'EasyChat for ' . $match['name'] : 'EasyChat для ' . $match['name'])),
            'url' => (string)$match['url'],
            'section' => (string)($match['section'] ?? (($match['locale'] ?? 'ru') === 'en' ? 'Supported platform' : 'Поддерживаемая платформа')),
            'locale' => (string)$match['locale'],
        ];
        return [
            'answer' => $answer,
            'grounding' => ['status' => 'grounded', 'confidence' => 1.0, 'sources' => [$source], 'clarification' => '', 'reason' => 'trusted_product_matrix'],
            'sources' => [$source],
            'handoff' => ['show' => false],
            'state' => 'answer',
        ];
    }

    public function fallback(array $match): array {
        return $this->finalize($this->fallbackAnswer($match), $match);
    }

    private function fallbackAnswer(array $match): string {
        if (isset($match['fallback'])) return (string)$match['fallback'];
        if (($match['locale'] ?? 'ru') === 'en') {
            return "Yes. EasyChat provides an official {$match['kind']} for {$match['name']}.";
        }
        return "Да. Для {$match['name']} у EasyChat есть официальный {$match['kind']}.";
    }

    private function isAvailabilityIntent(string $question): bool {
        return preg_match('/(?:есть\s+ли|есть|существу\w*|доступ\w*|поддержива\w*|имеется|выпуска\w*).{0,60}(?:модул\w*|плагин\w*|верс\w*|пакет\w*|интеграц\w*)|(?:модул\w*|плагин\w*|верс\w*|пакет\w*|интеграц\w*).{0,60}(?:для|под)|(?:is\s+there|do\s+you\s+have|available|support(?:ed|s)?).{0,60}(?:module|plugin|version|package|integration)/u', $question) === 1;
    }

    private function isCommercialIntent(string $question): bool {
        return preg_match('/(?:сколько\s+стоит|цен[аы]|стоимост|тариф|прайс|подписк|лицензи|купить|оплат|price|pricing|cost|subscription|license)/u', $question) === 1;
    }

    private function capability(string $question): string {
        $availability = '(?:есть\s+ли|есть|существу\w*|доступ\w*|имеется|выпуска\w*|планиру\w*|do\s+you\s+have|is\s+there|available|provide\w*|offer\w*)';
        $desktop = '(?:desktop|десктоп\w*|настольн\w*|windows|macos|mac\s*os|linux)';
        $application = '(?:приложен\w*|клиент\w*|программ\w*|app(?:lication)?|client|program)';
        if (preg_match('/' . $availability . '.{0,80}' . $desktop . '.{0,40}' . $application . '|' . $availability . '.{0,80}' . $application . '.{0,40}' . $desktop . '|' . $desktop . '.{0,40}' . $application . '.{0,80}' . $availability . '/u', $question)) {
            return 'desktop_app';
        }
        return '';
    }

    private function platform(string $question): string {
        if (preg_match('/(?:1с[- ]?битрикс|битрикс|bitrix)/u', $question)) return 'bitrix';
        if (preg_match('/opencart/u', $question)) return 'opencart';
        if (preg_match('/(?:wordpress|woocommerce)/u', $question)) return 'wordpress';
        if (preg_match('/(?:webasyst|shop[- ]?script)/u', $question)) return 'webasyst';
        if (preg_match('/(?:generic\s*php|обычн\w*\s+php|php[- ]?(?:сайт|site))/u', $question)) return 'generic';
        return '';
    }
}
