"""
Strategy Contracts v1 — Events.

رویدادهای عمومی ماژول Strategy.
سایر ماژول‌ها فقط از این فایل import می‌کنند.
"""

from dataclasses import dataclass
from datetime import datetime
from typing import Optional
from uuid import UUID


@dataclass(frozen=True)
class StrategyEvent:
    """رویداد پایه ماژول Strategy."""
    event_id: UUID
    tenant_id: UUID
    occurred_at: datetime
    version: int = 1


# ─── Vision Events ───────────────────────────────

@dataclass(frozen=True)
class VisionCreated(StrategyEvent):
    event_type: str = "strategy.vision.created"
    vision_id: Optional[UUID] = None
    title: str = ""


@dataclass(frozen=True)
class VisionActivated(StrategyEvent):
    event_type: str = "strategy.vision.activated"
    vision_id: Optional[UUID] = None


@dataclass(frozen=True)
class VisionArchived(StrategyEvent):
    event_type: str = "strategy.vision.archived"
    vision_id: Optional[UUID] = None


# ─── Strategic Theme Events ──────────────────────

@dataclass(frozen=True)
class StrategicThemeCreated(StrategyEvent):
    event_type: str = "strategy.theme.created"
    theme_id: Optional[UUID] = None
    vision_id: Optional[UUID] = None
    name: str = ""


@dataclass(frozen=True)
class StrategicThemeActivated(StrategyEvent):
    event_type: str = "strategy.theme.activated"
    theme_id: Optional[UUID] = None


@dataclass(frozen=True)
class StrategicThemeCompleted(StrategyEvent):
    event_type: str = "strategy.theme.completed"
    theme_id: Optional[UUID] = None


@dataclass(frozen=True)
class StrategicThemeArchived(StrategyEvent):
    event_type: str = "strategy.theme.archived"
    theme_id: Optional[UUID] = None


# ─── Objective Events ────────────────────────────

@dataclass(frozen=True)
class ObjectiveCreated(StrategyEvent):
    event_type: str = "strategy.objective.created"
    objective_id: Optional[UUID] = None
    theme_id: Optional[UUID] = None
    title: str = ""


@dataclass(frozen=True)
class ObjectiveActivated(StrategyEvent):
    event_type: str = "strategy.objective.activated"
    objective_id: Optional[UUID] = None


@dataclass(frozen=True)
class ObjectiveAchieved(StrategyEvent):
    event_type: str = "strategy.objective.achieved"
    objective_id: Optional[UUID] = None


@dataclass(frozen=True)
class ObjectiveMissed(StrategyEvent):
    event_type: str = "strategy.objective.missed"
    objective_id: Optional[UUID] = None


# ─── Key Result Events ───────────────────────────

@dataclass(frozen=True)
class KeyResultCreated(StrategyEvent):
    event_type: str = "strategy.key_result.created"
    key_result_id: Optional[UUID] = None
    objective_id: Optional[UUID] = None
    title: str = ""


@dataclass(frozen=True)
class KeyResultUpdated(StrategyEvent):
    event_type: str = "strategy.key_result.updated"
    key_result_id: Optional[UUID] = None
    current_value: str = ""
    progress: str = ""


@dataclass(frozen=True)
class KeyResultAchieved(StrategyEvent):
    event_type: str = "strategy.key_result.achieved"
    key_result_id: Optional[UUID] = None


@dataclass(frozen=True)
class CheckInRecorded(StrategyEvent):
    event_type: str = "strategy.check_in.recorded"
    check_in_id: Optional[UUID] = None
    key_result_id: Optional[UUID] = None
    value: str = ""
    confidence: str = ""


# ─── KPI Events ──────────────────────────────────

@dataclass(frozen=True)
class KPIDefinitionCreated(StrategyEvent):
    event_type: str = "strategy.kpi.created"
    kpi_id: Optional[UUID] = None
    name: str = ""
    code: str = ""


@dataclass(frozen=True)
class KPIDefinitionActivated(StrategyEvent):
    event_type: str = "strategy.kpi.activated"
    kpi_id: Optional[UUID] = None


@dataclass(frozen=True)
class KPIDefinitionArchived(StrategyEvent):
    event_type: str = "strategy.kpi.archived"
    kpi_id: Optional[UUID] = None


@dataclass(frozen=True)
class KPITargetSet(StrategyEvent):
    event_type: str = "strategy.kpi_target.set"
    kpi_target_id: Optional[UUID] = None
    kpi_id: Optional[UUID] = None
    target_value: str = ""


@dataclass(frozen=True)
class KPIActualRecorded(StrategyEvent):
    event_type: str = "strategy.kpi_actual.recorded"
    kpi_actual_id: Optional[UUID] = None
    kpi_id: Optional[UUID] = None
    actual_value: str = ""


@dataclass(frozen=True)
class KPIAssigned(StrategyEvent):
    event_type: str = "strategy.kpi.assigned"
    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(StrategyEvent):
    event_type: str = "strategy.map.created"
    map_id: Optional[UUID] = None
    name: str = ""


@dataclass(frozen=True)
class StrategyMapPublished(StrategyEvent):
    event_type: str = "strategy.map.published"
    map_id: Optional[UUID] = None


@dataclass(frozen=True)
class CausalLinkCreated(StrategyEvent):
    event_type: str = "strategy.causal_link.created"
    link_id: Optional[UUID] = None
    map_id: Optional[UUID] = None


# ─── Scorecard Events ────────────────────────────

@dataclass(frozen=True)
class ScorecardCreated(StrategyEvent):
    event_type: str = "strategy.scorecard.created"
    scorecard_id: Optional[UUID] = None


@dataclass(frozen=True)
class ScorecardActivated(StrategyEvent):
    event_type: str = "strategy.scorecard.activated"
    scorecard_id: Optional[UUID] = None


@dataclass(frozen=True)
class ScorecardClosed(StrategyEvent):
    event_type: str = "strategy.scorecard.closed"
    scorecard_id: Optional[UUID] = None


# ─── Stage-Gate Events ────────────────────────────

@dataclass(frozen=True)
class GateReviewStarted(StrategyEvent):
    event_type: str = "strategy.gate_review.started"
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None


@dataclass(frozen=True)
class GateReviewPassed(StrategyEvent):
    event_type: str = "strategy.gate_review.passed"
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None


@dataclass(frozen=True)
class GateReviewFailed(StrategyEvent):
    event_type: str = "strategy.gate_review.failed"
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None


@dataclass(frozen=True)
class GateReviewConditional(StrategyEvent):
    event_type: str = "strategy.gate_review.conditional"
    review_id: Optional[UUID] = None
    gate_id: Optional[UUID] = None


# ─── Policy Events ────────────────────────────────

@dataclass(frozen=True)
class PolicyActivated(StrategyEvent):
    event_type: str = "strategy.policy.activated"
    policy_id: Optional[UUID] = None


@dataclass(frozen=True)
class PolicyRetired(StrategyEvent):
    event_type: str = "strategy.policy.retired"
    policy_id: Optional[UUID] = None


@dataclass(frozen=True)
class PolicyAcknowledged(StrategyEvent):
    event_type: str = "strategy.policy.acknowledged"
    policy_id: Optional[UUID] = None
    user_id: Optional[UUID] = None
