"""
Strategy Domain — StrategicTheme Entity

تم‌های راهبردی — محورهای اصلی استراتژی سازمان.
"""

from dataclasses import dataclass, field
from datetime import date
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity

from ..value_objects.common import ThemePriority, ThemeStatus


@dataclass
class StrategicTheme(TenantEntity):
    """
    تم راهبردی — محور اصلی استراتژی.

    هر تم راهبردی زیرمجموعه یک چشم‌انداز است و
    اهداف کلیدی (OKR) از آن مشتق می‌شوند.
    """

    # --- Relations ---
    vision_id: Optional[UUID] = None  # → Vision

    # --- Identity ---
    name: str = ""
    description: str = ""

    # --- Priority & Status ---
    priority: str = ThemePriority.MEDIUM
    status: str = ThemeStatus.DRAFT

    # --- Ownership ---
    owner_id: Optional[UUID] = None  # → User

    # --- Timeline ---
    start_date: Optional[date] = None
    end_date: Optional[date] = None

    # --- Alignment ---
    sort_order: int = 0  # ترتیب نمایش

    # --- Metadata ---
    tags: Optional[list] = field(default_factory=list)
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Rules ───

    def can_activate(self) -> bool:
        """تم زمانی فعال می‌شود که نام داشته باشد و به چشم‌انداز متصل باشد."""
        return (
            self.status == ThemeStatus.DRAFT
            and self.name != ""
            and self.vision_id is not None
        )

    def activate(self) -> None:
        if not self.can_activate():
            raise ValueError("تم راهبردی قابل فعال‌سازی نیست — نام و چشم‌انداز الزامی است.")
        self.status = ThemeStatus.ACTIVE

    def complete(self) -> None:
        if self.status != ThemeStatus.ACTIVE:
            raise ValueError("فقط تم فعال قابل تکمیل است.")
        self.status = ThemeStatus.COMPLETED

    def archive(self) -> None:
        if self.status not in (ThemeStatus.ACTIVE, ThemeStatus.COMPLETED):
            raise ValueError("فقط تم فعال یا تکمیل‌شده قابل بایگانی است.")
        self.status = ThemeStatus.ARCHIVED

    def validate_dates(self) -> bool:
        """بررسی اعتبار بازه زمانی."""
        if self.start_date and self.end_date:
            return self.end_date > self.start_date
        return True

    def set_priority(self, priority: str) -> None:
        if priority not in ThemePriority.ALL:
            raise ValueError(f"اولویت نامعتبر: {priority}")
        self.priority = priority
