"""
Batch & Serial 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 BatchStatus(str, Enum):
    ACTIVE = "ACTIVE"
    EXPIRED = "EXPIRED"
    BLOCKED = "BLOCKED"
    QUARANTINE = "QUARANTINE"


class QualityStatus(str, Enum):
    APPROVED = "APPROVED"
    PENDING = "PENDING"
    REJECTED = "REJECTED"
    CONDITIONAL = "CONDITIONAL"


class SerialStatus(str, Enum):
    IN_STOCK = "IN_STOCK"
    SOLD = "SOLD"
    RETURNED = "RETURNED"
    SCRAPPED = "SCRAPPED"
    IN_REPAIR = "IN_REPAIR"
    IN_TRANSIT = "IN_TRANSIT"


@dataclass
class Batch(TenantEntity):
    """بچ / لات."""

    batch_number: str = ""
    item_id: Optional[UUID] = None
    manufacturing_date: Optional[date] = None
    expiry_date: Optional[date] = None
    vendor_batch_number: str = ""
    vendor_id: Optional[UUID] = None
    production_order_id: Optional[UUID] = None

    batch_status: BatchStatus = BatchStatus.ACTIVE
    quality_status: QualityStatus = QualityStatus.PENDING

    # Custom attributes
    batch_attributes: dict = None

    company_id: Optional[UUID] = None
    is_active: bool = True

    def __post_init__(self):
        if self.batch_attributes is None:
            self.batch_attributes = {}

    def is_expired(self) -> bool:
        if self.expiry_date:
            return date.today() > self.expiry_date
        return False

    def block(self):
        self.batch_status = BatchStatus.BLOCKED
        self.mark_updated()


@dataclass
class SerialNumber(TenantEntity):
    """شماره سریال."""

    serial_no: str = ""
    item_id: Optional[UUID] = None
    batch_id: Optional[UUID] = None

    manufacturing_date: Optional[date] = None
    warranty_start_date: Optional[date] = None
    warranty_end_date: Optional[date] = None
    warranty_months: int = 0

    # Current location
    current_warehouse_id: Optional[UUID] = None
    current_location_id: Optional[UUID] = None
    current_stock_status_id: Optional[UUID] = None

    # Ownership
    current_owner_type: str = "OWN"
    current_owner_id: Optional[UUID] = None

    # Status
    serial_status: SerialStatus = SerialStatus.IN_STOCK
    quality_status: QualityStatus = QualityStatus.APPROVED

    # Traceability
    supplier_serial_number: str = ""
    vendor_id: Optional[UUID] = None
    purchase_order_id: Optional[UUID] = None
    sales_order_id: Optional[UUID] = None
    customer_id: Optional[UUID] = None
    sold_date: Optional[date] = None

    company_id: Optional[UUID] = None
    is_active: bool = True


@dataclass
class SerialNumberHistory(TenantEntity):
    """تاریخچه حرکات سریال."""

    serial_number_id: Optional[UUID] = None
    stock_ledger_id: Optional[UUID] = None
    transaction_date: Optional[datetime] = None
    transaction_type: str = ""

    from_warehouse_id: Optional[UUID] = None
    to_warehouse_id: Optional[UUID] = None
    from_location_id: Optional[UUID] = None
    to_location_id: Optional[UUID] = None
    from_status_id: Optional[UUID] = None
    to_status_id: Optional[UUID] = None

    remarks: str = ""
