"""
Strategy Domain — Vision 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 VisionStatus


@dataclass
class Vision(TenantEntity):
    """
    چشم‌انداز — Aggregate Root لایه راهبرد.

    هر سازمان یک یا چند چشم‌انداز تعریف می‌کند
    که تم‌های راهبردی از آن مشتق می‌شوند.
    """

    # --- Identity ---
    title: str = ""
    description: str = ""

    # --- Timeline ---
    time_horizon_start: Optional[date] = None
    time_horizon_end: Optional[date] = None

    # --- Status ---
    status: str = VisionStatus.DRAFT

    # --- Ownership ---
    owner_id: Optional[UUID] = None  # → User (مالک چشم‌انداز)

    # --- 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 == VisionStatus.DRAFT
            and self.title != ""
            and self.time_horizon_start is not None
            and self.time_horizon_end is not None
        )

    def activate(self) -> None:
        if not self.can_activate():
            raise ValueError("چشم‌انداز قابل فعال‌سازی نیست — عنوان و بازه زمانی الزامی است.")
        self.status = VisionStatus.ACTIVE

    def archive(self) -> None:
        if self.status != VisionStatus.ACTIVE:
            raise ValueError("فقط چشم‌انداز فعال قابل بایگانی است.")
        self.status = VisionStatus.ARCHIVED

    def reactivate(self) -> None:
        if self.status != VisionStatus.ARCHIVED:
            raise ValueError("فقط چشم‌انداز بایگانی‌شده قابل فعال‌سازی مجدد است.")
        self.status = VisionStatus.ACTIVE

    def validate_time_horizon(self) -> bool:
        """بررسی اعتبار بازه زمانی."""
        if self.time_horizon_start and self.time_horizon_end:
            return self.time_horizon_end > self.time_horizon_start
        return True
