"""Общие инструменты анализа индикаторов."""

from __future__ import annotations

import logging
from typing import Any, Mapping

_logger = logging.getLogger(__name__)

from .reason_texts import ANALYSIS_NOT_IMPLEMENTED_REASON


class IndicatorVerdict:
    """Поддерживаемые вердикты анализа индикатора."""

    IGNORE = "Пропуск"
    MANUAL_REVIEW = "Ручная проверка"
    BLOCK = "Блокировка"
    MONITOR = "Мониторинг"


def default_verdict(reason: str | None = None) -> dict[str, Any]:
    """Вернуть вердикт по умолчанию для незаполненного анализа."""

    reasons: list[dict[str, Any]] = []
    if reason:
        reasons.append({"text": reason})

    return {
        "verdicts": [IndicatorVerdict.IGNORE],
        "reasons": reasons,
    }


def build_kaspersky_zone_verdict(
    features: Mapping[str, Any],
    *,
    block_reason: str,
    monitor_reason: str,
    ok_reason: str,
) -> dict[str, Any]:
    """Сформировать вердикт по зоне Kaspersky."""

    kaspersky_features = features.get("kaspersky") or {}
    kasp_zone = kaspersky_features.get("kasp_zone")

    if kasp_zone != "Green":
        _logger.info("Зона Kaspersky=%s требует блокировки", kasp_zone)
        return {
            "verdicts": [IndicatorVerdict.BLOCK, IndicatorVerdict.MONITOR],
            "reasons": [
                {"text": block_reason},
                {"text": monitor_reason},
            ],
        }

    _logger.info("Зона Kaspersky Green, оставляем инцидент без реакции")
    return default_verdict(ok_reason)


class IndicatorAnalysisMixin:
    """Общий dummy-метод анализа для индикаторов."""

    def pre_analysis(self) -> dict[str, Any]:
        """Быстрая проверка индикатора перед обращением к провайдерам."""

        _logger.info(
            "Быстрых правил для индикатора %s не найдено, продолжаем полный анализ",
            getattr(self, "value", ""),
        )
        return {}

    def analysis(self, features: Mapping[str, Any] | None = None) -> dict[str, Any]:
        """Принять фичи провайдеров и вернуть заглушку результата анализа."""

        prepared_features = features or {}
        _logger.info("Запускаем анализ индикатора: %s", getattr(self, "value", ""))
        _logger.debug("Фичи провайдеров для анализа: %s", prepared_features)
        return {
            "features": prepared_features,
            "status": "not_implemented",
            "tags": [],
            **default_verdict(ANALYSIS_NOT_IMPLEMENTED_REASON),
        }
