"""
Quality Management Domain Entities.
"""
from dataclasses import dataclass
from datetime import date, datetime
from enum import Enum
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class InspectionType(str, Enum):
    INCOMING = "INCOMING"
    IN_PROCESS = "IN_PROCESS"
    OUTGOING = "OUTGOING"


class InspectionStatus(str, Enum):
    PENDING = "PENDING"
    IN_PROGRESS = "IN_PROGRESS"
    COMPLETED = "COMPLETED"


class QualityDecision(str, Enum):
    PENDING = "PENDING"
    ACCEPTED = "ACCEPTED"
    REJECTED = "REJECTED"
    CONDITIONAL = "CONDITIONAL"
    REWORK = "REWORK"


class ResultStatus(str, Enum):
    PASS = "PASS"
    FAIL = "FAIL"
    WARNING = "WARNING"


class QualityActionType(str, Enum):
    BLOCK = "BLOCK"
    QUARANTINE = "QUARANTINE"
    REWORK = "REWORK"
    SCRAP = "SCRAP"
    RETURN_TO_VENDOR = "RETURN_TO_VENDOR"
    RELEASE = "RELEASE"


@dataclass
class InspectionLot(TenantEntity):
    """لات بازرسی."""

    inspection_lot_number: str = ""
    inspection_type: InspectionType = InspectionType.INCOMING
    inspection_date: Optional[date] = None

    item_id: Optional[UUID] = None
    batch_id: Optional[UUID] = None
    warehouse_id: Optional[UUID] = None

    source_document_type: str = ""
    source_document_id: Optional[UUID] = None
    source_sle_id: Optional[UUID] = None

    inspection_quantity: float = 0.0
    sample_size: float = 0.0
    uom_id: Optional[UUID] = None

    inspection_status: InspectionStatus = InspectionStatus.PENDING
    quality_decision: QualityDecision = QualityDecision.PENDING

    inspection_start_date: Optional[date] = None
    inspection_complete_date: Optional[date] = None

    inspector_id: Optional[UUID] = None
    approved_by: Optional[UUID] = None
    approved_date: Optional[date] = None

    remarks: str = ""
    company_id: Optional[UUID] = None

    def start_inspection(self, inspector_id: UUID):
        self.inspection_status = InspectionStatus.IN_PROGRESS
        self.inspection_start_date = date.today()
        self.inspector_id = inspector_id
        self.mark_updated()

    def complete_inspection(self, decision: QualityDecision):
        self.inspection_status = InspectionStatus.COMPLETED
        self.inspection_complete_date = date.today()
        self.quality_decision = decision
        self.mark_updated()


@dataclass
class InspectionResult(TenantEntity):
    """نتایج بازرسی."""

    inspection_lot_id: Optional[UUID] = None
    inspection_characteristic: str = ""
    target_value: str = ""
    actual_value: str = ""
    tolerance_lower: Optional[float] = None
    tolerance_upper: Optional[float] = None
    result_status: ResultStatus = ResultStatus.PASS
    tested_by: Optional[UUID] = None
    tested_date: Optional[datetime] = None
    remarks: str = ""


@dataclass
class QualityAction(TenantEntity):
    """اقدام کیفی."""

    inspection_lot_id: Optional[UUID] = None
    action_type: QualityActionType = QualityActionType.RELEASE
    action_date: Optional[date] = None
    action_quantity: float = 0.0
    target_stock_status_id: Optional[UUID] = None
    action_by: Optional[UUID] = None
    remarks: str = ""
    completed_date: Optional[date] = None
