<?php
namespace EasyChat\Library\Messenger;

class ServiceNoticeClassifier {

    public function classify(string $provider_code, string $text, array $message = []): array {
        $provider_code = strtolower(trim($provider_code));
        if ((string)($message['message_kind'] ?? '') === 'messenger_system_event') {
            return [
                'blocked' => true,
                'reason' => 'messenger_system_event',
                'confidence' => 'high',
            ];
        }
        $text = $this->normalizeText($text);
        if ($text === '') {
            return $this->allow();
        }

        if ($this->isAttachmentDownloadPlaceholder($text, $message)) {
            return [
                'blocked' => true,
                'reason' => 'attachment_download_placeholder',
                'confidence' => 'high',
            ];
        }

        if ($provider_code === 'max') {
            return $this->classifyMax($text, $message);
        }

        return $this->allow();
    }

    public function shouldBlockAi(string $provider_code, string $text, array $message = []): bool {
        $result = $this->classify($provider_code, $text, $message);
        return !empty($result['blocked']);
    }

    private function isAttachmentDownloadPlaceholder(string $text, array $message): bool {
        if (!empty($message) && isset($message['author']) && (int)$message['author'] !== 1) {
            return false;
        }

        return $this->contains($text, 'пользователь отправил вложение в')
            && $this->contains($text, 'easychat пока не смог получить файл');
    }

    private function classifyMax(string $text, array $message): array {
        if (!empty($message) && isset($message['author']) && (int)$message['author'] !== 1) {
            return $this->allow();
        }

        $strong_markers = [
            'новый вход в max',
            'новый вход в мах',
            'обнаружили вход в профиль',
            'если это были не вы',
            'завершить все сессии',
            'нежелательный доступ к вашим данным',
            'настройки -> устройства',
            'настройки → устройства',
            'перейдите в настройки устройства',
        ];

        $hits = 0;
        foreach ($strong_markers as $marker) {
            if ($this->contains($text, $marker)) {
                $hits++;
            }
        }

        if ($hits >= 2 || preg_match('/новый\s+вход[\s\S]{0,80}m(?:a|а)x/iu', $text)) {
            return [
                'blocked' => true,
                'reason' => 'max_security_login_notice',
                'confidence' => 'high',
            ];
        }

        return $this->allow();
    }

    private function normalizeText(string $text): string {
        $text = trim($text);
        if ($text === '') {
            return '';
        }
        $decoded = rawurldecode($text);
        if ($decoded !== '' && $decoded !== $text && preg_match('/%[0-9A-Fa-f]{2}/', $text)) {
            $text = $decoded;
        }
        $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
        $text = preg_replace('/\s+/u', ' ', $text);
        return trim((string)$text);
    }

    private function contains(string $text, string $needle): bool {
        return preg_match('/' . preg_quote($needle, '/') . '/iu', $text) === 1;
    }

    private function allow(): array {
        return [
            'blocked' => false,
            'reason' => '',
            'confidence' => 'none',
        ];
    }
}
