"""Identifies business risks in the product / store / SKU data."""
from __future__ import annotations

from dataclasses import dataclass, field

from ...constants import constants as C
from ...utils.helpers import clamp

from .product_analyzer import ProductAnalysis
from .store_analyzer import StoreAnalysis
from .sku.sku_decision_engine import SkuDecision


@dataclass
class RiskAnalysis:
    score: float                  # 0-100, higher = riskier
    risks: list[str] = field(default_factory=list)

    def to_dict(self) -> dict:
        return {"score": round(self.score, 2), "risks": self.risks}


class RiskAnalyzer:
    """Single responsibility: enumerate risks; each risk adds a fixed amount
    to the risk score (capped at 100)."""

    def analyze(
        self,
        product: ProductAnalysis,
        store: StoreAnalysis,
        sku_decisions: list[SkuDecision],
    ) -> RiskAnalysis:
        risks: list[str] = []

        best = max(sku_decisions, key=lambda d: d.result.score) if sku_decisions else None
        total_stock = sum(d.sku.stock for d in sku_decisions)

        if total_stock < C.RISK_LOW_STOCK_UNITS:
            risks.append(f"Low stock: only {total_stock} units available across all SKUs")
        if 0 < store.average_rating < C.RISK_POOR_RATING:
            risks.append(f"Poor store ratings: average {store.average_rating:.1f}/5")
        if best and (best.freight.delivery_days_max or 0) > C.RISK_LONG_SHIPPING_DAYS:
            risks.append(
                f"Long shipping: up to {best.freight.delivery_days_max} days for the best SKU"
            )
        if best and best.freight.shipping_cost > C.RISK_HIGH_SHIPPING_COST:
            risks.append(
                f"High shipping cost: {best.freight.shipping_cost:.2f} for the best SKU"
            )
        if product.review_count < C.RISK_LOW_REVIEW_COUNT:
            risks.append(f"Low review count: only {product.review_count} product reviews")
        if store.score < C.RISK_WEAK_STORE_SCORE:
            risks.append(f"Weak store: store score {store.score:.0f}/100")
        if product.weight_kg > C.RISK_HEAVY_PACKAGE_KG:
            risks.append(f"Heavy package: {product.weight_kg:.2f} kg raises shipping costs")
        if product.largest_dimension_cm > C.RISK_LARGE_PACKAGE_CM:
            risks.append(
                f"Large package: {product.largest_dimension_cm:.0f} cm may trigger surcharges"
            )

        score = clamp(len(risks) * C.RISK_POINTS_PER_ITEM)
        return RiskAnalysis(score=score, risks=risks)
