"""
Quality Management Domain Entities.

موجودیت‌های دامنه مدیریت کیفیت پروژه.
"""
from dataclasses import dataclass, field
from datetime import date, datetime
from decimal import Decimal
from typing import Optional, List
from uuid import UUID, uuid4

from shared.base_classes.entity import TenantEntity
from ..value_objects.common import (
    QualityPlanStatus,
    InspectionType, InspectionStatus, InspectionResult,
    NCRSeverity, NCRStatus,
)


# ═══════════════════════════════════════════════════
# Quality Plan — طرح کیفیت
# ═══════════════════════════════════════════════════

@dataclass
class QualityPlan(TenantEntity):
    """طرح کیفیت پروژه — شامل معیارها و استانداردها."""

    project_id: UUID = field(default_factory=uuid4)

    name: str = ""
    description: str = ""
    status: QualityPlanStatus = QualityPlanStatus.DRAFT

    # --- Standards & Criteria ---
    criteria: str = ""            # معیارهای پذیرش
    standards: str = ""           # استانداردهای مرجع (ISO, PMBOK, ...)
    objectives: str = ""          # اهداف کیفیت
    scope: str = ""               # محدوده طرح

    # --- People ---
    quality_manager_id: Optional[UUID] = None

    # --- Dates ---
    effective_date: Optional[date] = None
    review_date: Optional[date] = None

    # --- Metadata ---
    version: str = "1.0"
    notes: str = ""
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Methods ────────────────────────────

    def activate(self):
        self.status = QualityPlanStatus.ACTIVE

    def approve(self):
        self.status = QualityPlanStatus.APPROVED

    def archive(self):
        self.status = QualityPlanStatus.ARCHIVED

    def submit_for_review(self):
        self.status = QualityPlanStatus.UNDER_REVIEW


# ═══════════════════════════════════════════════════
# Inspection — بازرسی
# ═══════════════════════════════════════════════════

@dataclass
class Inspection(TenantEntity):
    """بازرسی کیفیت — ممیزی و ارزیابی."""

    project_id: UUID = field(default_factory=uuid4)

    code: str = ""                # INS-001, INS-002, ...
    title: str = ""
    description: str = ""

    # --- Classification ---
    inspection_type: InspectionType = InspectionType.QUALITY_AUDIT
    status: InspectionStatus = InspectionStatus.PLANNED
    result: InspectionResult = InspectionResult.NOT_APPLICABLE

    # --- Relations ---
    quality_plan_id: Optional[UUID] = None
    task_id: Optional[UUID] = None

    # --- People ---
    inspector_id: Optional[UUID] = None

    # --- Findings ---
    findings: str = ""
    recommendations: str = ""

    # --- Dates ---
    planned_date: Optional[date] = None
    actual_date: Optional[date] = None

    # --- Metadata ---
    notes: str = ""
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Methods ────────────────────────────

    def start(self):
        self.status = InspectionStatus.IN_PROGRESS

    def complete(self, result: InspectionResult, findings: str = ""):
        self.status = InspectionStatus.COMPLETED
        self.result = result
        if findings:
            self.findings = findings
        self.actual_date = date.today()

    def cancel(self):
        self.status = InspectionStatus.CANCELLED

    @property
    def is_overdue(self) -> bool:
        if self.planned_date and self.status == InspectionStatus.PLANNED:
            return date.today() > self.planned_date
        return False


# ═══════════════════════════════════════════════════
# NCR — گزارش عدم انطباق
# ═══════════════════════════════════════════════════

@dataclass
class NCR(TenantEntity):
    """گزارش عدم انطباق (Non-Conformance Report)."""

    project_id: UUID = field(default_factory=uuid4)

    code: str = ""                # NCR-001, NCR-002, ...
    title: str = ""
    description: str = ""

    # --- Classification ---
    severity: NCRSeverity = NCRSeverity.MINOR
    status: NCRStatus = NCRStatus.OPEN

    # --- Relations ---
    inspection_id: Optional[UUID] = None
    task_id: Optional[UUID] = None

    # --- People ---
    reported_by_id: Optional[UUID] = None
    assigned_to_id: Optional[UUID] = None

    # --- Root Cause & Actions ---
    root_cause: str = ""
    corrective_action: str = ""
    preventive_action: str = ""

    # --- Impact ---
    cost_impact: Decimal = Decimal("0")
    schedule_impact_days: int = 0

    # --- Dates ---
    identified_date: Optional[date] = None
    due_date: Optional[date] = None
    resolved_date: Optional[date] = None
    closed_date: Optional[date] = None

    # --- Metadata ---
    notes: str = ""
    metadata: Optional[dict] = field(default_factory=dict)

    # ─── Business Methods ────────────────────────────

    def start_review(self):
        self.status = NCRStatus.UNDER_REVIEW

    def require_action(self):
        self.status = NCRStatus.ACTION_REQUIRED

    def start_resolution(self):
        self.status = NCRStatus.IN_PROGRESS

    def resolve(self, corrective_action: str = ""):
        self.status = NCRStatus.RESOLVED
        if corrective_action:
            self.corrective_action = corrective_action
        self.resolved_date = date.today()

    def verify(self):
        self.status = NCRStatus.VERIFIED

    def close(self):
        self.status = NCRStatus.CLOSED
        self.closed_date = date.today()

    @property
    def is_overdue(self) -> bool:
        if self.due_date and self.status not in (NCRStatus.RESOLVED, NCRStatus.VERIFIED, NCRStatus.CLOSED):
            return date.today() > self.due_date
        return False

    @property
    def is_critical(self) -> bool:
        return self.severity == NCRSeverity.CRITICAL


# ═══════════════════════════════════════════════════
# Quality Checklist — چک‌لیست کیفیت
# ═══════════════════════════════════════════════════

@dataclass
class QualityChecklist(TenantEntity):
    """چک‌لیست کیفیت — فهرست آیتم‌های بررسی."""

    project_id: UUID = field(default_factory=uuid4)

    name: str = ""
    description: str = ""

    # --- Relations ---
    quality_plan_id: Optional[UUID] = None
    task_id: Optional[UUID] = None

    # --- Status ---
    is_completed: bool = False
    completed_date: Optional[date] = None
    completed_by_id: Optional[UUID] = None

    # --- Metadata ---
    notes: str = ""
    metadata: Optional[dict] = field(default_factory=dict)

    def mark_complete(self, completed_by_id: UUID):
        self.is_completed = True
        self.completed_date = date.today()
        self.completed_by_id = completed_by_id


@dataclass
class QualityChecklistItem(TenantEntity):
    """آیتم چک‌لیست کیفیت."""

    checklist_id: UUID = field(default_factory=uuid4)

    title: str = ""
    description: str = ""
    sort_order: int = 0

    # --- Status ---
    is_checked: bool = False
    checked_by_id: Optional[UUID] = None
    checked_date: Optional[date] = None

    # --- Result ---
    result: str = ""   # pass / fail / na
    remarks: str = ""

    def check(self, checked_by_id: UUID, result: str = "pass", remarks: str = ""):
        self.is_checked = True
        self.checked_by_id = checked_by_id
        self.checked_date = date.today()
        self.result = result
        self.remarks = remarks

    def uncheck(self):
        self.is_checked = False
        self.checked_by_id = None
        self.checked_date = None
        self.result = ""
        self.remarks = ""
