"""
Strategy Domain — Events.
"""

from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional
from uuid import UUID, uuid4


@dataclass(frozen=True)
class StrategyDomainEvent:
    """رویداد پایه دامنه Strategy."""
    event_id: UUID = field(default_factory=uuid4)
    tenant_id: Optional[UUID] = None
    occurred_at: datetime = field(default_factory=datetime.now)


# ─── Vision Events ───────────────────────────────

@dataclass(frozen=True)
class VisionCreated(StrategyDomainEvent):
    vision_id: Optional[UUID] = None
    title: str = ""

@dataclass(frozen=True)
class VisionActivated(StrategyDomainEvent):
    vision_id: Optional[UUID] = None

@dataclass(frozen=True)
class VisionArchived(StrategyDomainEvent):
    vision_id: Optional[UUID] = None


# ─── Strategic Theme Events ─────────────────────

@dataclass(frozen=True)
class StrategicThemeCreated(StrategyDomainEvent):
    theme_id: Optional[UUID] = None
    vision_id: Optional[UUID] = None
    name: str = ""

@dataclass(frozen=True)
class StrategicThemeActivated(StrategyDomainEvent):
    theme_id: Optional[UUID] = None

@dataclass(frozen=True)
class StrategicThemeCompleted(StrategyDomainEvent):
    theme_id: Optional[UUID] = None

@dataclass(frozen=True)
class StrategicThemeArchived(StrategyDomainEvent):
    theme_id: Optional[UUID] = None


# ─── Objective Events ────────────────────────────

@dataclass(frozen=True)
class ObjectiveCreated(StrategyDomainEvent):
    objective_id: Optional[UUID] = None
    theme_id: Optional[UUID] = None
    title: str = ""

@dataclass(frozen=True)
class ObjectiveActivated(StrategyDomainEvent):
    objective_id: Optional[UUID] = None

@dataclass(frozen=True)
class ObjectiveAchieved(StrategyDomainEvent):
    objective_id: Optional[UUID] = None

@dataclass(frozen=True)
class ObjectiveMissed(StrategyDomainEvent):
    objective_id: Optional[UUID] = None


# ─── Key Result Events ───────────────────────────

@dataclass(frozen=True)
class KeyResultCreated(StrategyDomainEvent):
    key_result_id: Optional[UUID] = None
    objective_id: Optional[UUID] = None
    title: str = ""

@dataclass(frozen=True)
class KeyResultUpdated(StrategyDomainEvent):
    key_result_id: Optional[UUID] = None
    current_value: str = ""
    progress: str = ""

@dataclass(frozen=True)
class KeyResultAchieved(StrategyDomainEvent):
    key_result_id: Optional[UUID] = None

@dataclass(frozen=True)
class CheckInRecorded(StrategyDomainEvent):
    check_in_id: Optional[UUID] = None
    key_result_id: Optional[UUID] = None
    value: str = ""
    confidence: str = ""


# ─── KPI Events ──────────────────────────────────

@dataclass(frozen=True)
class KPIDefinitionCreated(StrategyDomainEvent):
    kpi_id: Optional[UUID] = None
    name: str = ""
    code: str = ""

@dataclass(frozen=True)
class KPIDefinitionActivated(StrategyDomainEvent):
    kpi_id: Optional[UUID] = None

@dataclass(frozen=True)
class KPIDefinitionArchived(StrategyDomainEvent):
    kpi_id: Optional[UUID] = None

@dataclass(frozen=True)
class KPITargetSet(StrategyDomainEvent):
    kpi_target_id: Optional[UUID] = None
    kpi_id: Optional[UUID] = None
    target_value: str = ""

@dataclass(frozen=True)
class KPIActualRecorded(StrategyDomainEvent):
    kpi_actual_id: Optional[UUID] = None
    kpi_id: Optional[UUID] = None
    actual_value: str = ""

@dataclass(frozen=True)
class KPIAssigned(StrategyDomainEvent):
    assignment_id: Optional[UUID] = None
    kpi_id: Optional[UUID] = None
    level: str = ""
    entity_id: Optional[UUID] = None


# ─── Strategy Map Events ─────────────────────────

@dataclass(frozen=True)
class StrategyMapCreated(StrategyDomainEvent):
    map_id: Optional[UUID] = None
    name: str = ""

@dataclass(frozen=True)
class StrategyMapPublished(StrategyDomainEvent):
    map_id: Optional[UUID] = None

@dataclass(frozen=True)
class CausalLinkCreated(StrategyDomainEvent):
    link_id: Optional[UUID] = None
    map_id: Optional[UUID] = None


# ─── Scorecard Events ────────────────────────────

@dataclass(frozen=True)
class ScorecardCreated(StrategyDomainEvent):
    scorecard_id: Optional[UUID] = None

@dataclass(frozen=True)
class ScorecardActivated(StrategyDomainEvent):
    scorecard_id: Optional[UUID] = None

@dataclass(frozen=True)
class ScorecardClosed(StrategyDomainEvent):
    scorecard_id: Optional[UUID] = None


# ─── Stage-Gate Events ────────────────────────────

@dataclass(frozen=True)
class GateReviewStarted(StrategyDomainEvent):
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None

@dataclass(frozen=True)
class GateReviewPassed(StrategyDomainEvent):
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None

@dataclass(frozen=True)
class GateReviewFailed(StrategyDomainEvent):
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None

@dataclass(frozen=True)
class GateReviewConditional(StrategyDomainEvent):
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None


# ─── Policy Events ────────────────────────────────

@dataclass(frozen=True)
class PolicyActivated(StrategyDomainEvent):
    policy_id: Optional[UUID] = None

@dataclass(frozen=True)
class PolicyRetired(StrategyDomainEvent):
    policy_id: Optional[UUID] = None

@dataclass(frozen=True)
class PolicyAcknowledged(StrategyDomainEvent):
    policy_id: Optional[UUID] = None
    user_id: Optional[UUID] = None
