"""
Strategy Domain Entity — KPI Definition.
"""

from __future__ import annotations

import uuid
from dataclasses import dataclass, field
from datetime import datetime
from typing import Any, Optional

from shared.base_classes.entity import TenantEntity


@dataclass
class KPIDefinition(TenantEntity):
    """شاخص کلیدی عملکرد."""

    name: str = ""
    code: str = ""
    description: str = ""
    category: str = ""
    unit_of_measure: str = ""

    # direction: higher_is_better / lower_is_better / target
    direction: str = "higher_is_better"

    # frequency: daily / weekly / monthly / quarterly / yearly
    frequency: str = "monthly"

    # data_source: manual / calculated / integrated
    data_source: str = "manual"

    formula: Optional[str] = None  # For calculated KPIs

    # RAG thresholds
    threshold_red: Optional[float] = None
    threshold_yellow: Optional[float] = None
    threshold_green: Optional[float] = None

    owner_id: Optional[uuid.UUID] = None
    responsible_role: str = ""

    status: str = "draft"  # draft / active / archived

    tags: list[str] = field(default_factory=list)
    metadata: dict[str, Any] = field(default_factory=dict)

    # ── Business Rules ──────────────────────────

    def activate(self) -> None:
        if self.status == "archived":
            raise ValueError("آرشیو‌شده قابل فعال‌سازی نیست")
        self.status = "active"

    def archive(self) -> None:
        self.status = "archived"

    def validate_thresholds(self) -> None:
        """Validate RAG threshold ordering based on direction."""
        if all(v is not None for v in [self.threshold_red, self.threshold_yellow, self.threshold_green]):
            if self.direction == "higher_is_better":
                if not (self.threshold_red <= self.threshold_yellow <= self.threshold_green):
                    raise ValueError("آستانه‌ها باید به ترتیب صعودی باشند (قرمز ≤ زرد ≤ سبز)")
            elif self.direction == "lower_is_better":
                if not (self.threshold_green <= self.threshold_yellow <= self.threshold_red):
                    raise ValueError("آستانه‌ها باید به ترتیب نزولی باشند (سبز ≤ زرد ≤ قرمز)")

    def calculate_rag_status(self, value: float) -> str:
        """Calculate RAG status for a given value."""
        if any(v is None for v in [self.threshold_red, self.threshold_yellow, self.threshold_green]):
            return "unknown"

        if self.direction == "higher_is_better":
            if value >= self.threshold_green:
                return "green"
            elif value >= self.threshold_yellow:
                return "yellow"
            else:
                return "red"
        elif self.direction == "lower_is_better":
            if value <= self.threshold_green:
                return "green"
            elif value <= self.threshold_yellow:
                return "yellow"
            else:
                return "red"
        else:
            # target: closest to green threshold
            diff_green = abs(value - self.threshold_green)
            diff_yellow = abs(value - self.threshold_yellow)
            if diff_green <= diff_yellow:
                return "green"
            elif value <= self.threshold_yellow:
                return "yellow"
            else:
                return "red"
