"""
Master Data Domain Entities — Item, ItemType, ItemGroup, UOM, etc.
"""
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Optional, List
from uuid import UUID, uuid4

from shared.base_classes.entity import TenantEntity


# ─── Enums ────────────────────────────────────────────────────────────────


class ItemStatus(str, Enum):
    ACTIVE = "ACTIVE"
    INACTIVE = "INACTIVE"
    OBSOLETE = "OBSOLETE"


class ABCClassification(str, Enum):
    A = "A"
    B = "B"
    C = "C"


class UOMType(str, Enum):
    QUANTITY = "QUANTITY"
    WEIGHT = "WEIGHT"
    VOLUME = "VOLUME"
    LENGTH = "LENGTH"
    AREA = "AREA"
    TIME = "TIME"


# ─── Value Objects ────────────────────────────────────────────────────────


@dataclass(frozen=True)
class ItemCode:
    """کد یکتای کالا."""
    value: str

    def __post_init__(self):
        if not self.value or len(self.value) > 50:
            raise ValueError("Item code must be 1-50 characters")


# ─── Entities ─────────────────────────────────────────────────────────────


@dataclass
class ItemType(TenantEntity):
    """نوع کالا — Raw Material, Finished Goods, etc."""
    type_code: str = ""
    type_name: str = ""
    description: str = ""
    is_active: bool = True


@dataclass
class ItemGroup(TenantEntity):
    """گروه / دسته‌بندی کالا — سلسله‌مراتبی."""
    group_code: str = ""
    group_name: str = ""
    parent_group_id: Optional[UUID] = None
    level: int = 0
    default_costing_method_id: Optional[UUID] = None
    is_active: bool = True


@dataclass
class UnitOfMeasure(TenantEntity):
    """واحد اندازه‌گیری."""
    uom_code: str = ""
    uom_name: str = ""
    uom_name_local: str = ""
    uom_type: UOMType = UOMType.QUANTITY
    decimal_places: int = 0
    is_active: bool = True


@dataclass
class Item(TenantEntity):
    """کالا — Aggregate Root."""

    item_code: str = ""
    item_name: str = ""
    item_name_local: str = ""
    item_description: str = ""
    item_type_id: Optional[UUID] = None
    item_group_id: Optional[UUID] = None
    base_uom_id: Optional[UUID] = None

    # Tracking
    is_batch_managed: bool = False
    is_serial_managed: bool = False
    is_expiry_managed: bool = False
    abc_classification: Optional[ABCClassification] = None
    item_status: ItemStatus = ItemStatus.ACTIVE

    # Flags
    is_purchasable: bool = True
    is_saleable: bool = True
    is_stockable: bool = True
    is_producible: bool = False

    # Planning
    lead_time_days: int = 0
    shelf_life_days: Optional[int] = None
    default_warehouse_id: Optional[UUID] = None

    # Owner
    company_id: Optional[UUID] = None

    def activate(self):
        self.item_status = ItemStatus.ACTIVE
        self.mark_updated()

    def deactivate(self):
        self.item_status = ItemStatus.INACTIVE
        self.mark_updated()

    def mark_obsolete(self):
        self.item_status = ItemStatus.OBSOLETE
        self.mark_updated()


@dataclass
class ItemAttribute(TenantEntity):
    """ویژگی کالا — key/value."""
    item_id: Optional[UUID] = None
    attribute_name: str = ""
    attribute_value: str = ""
    attribute_data_type: str = "Text"  # Text, Number, Date, Boolean
    display_order: int = 0


@dataclass
class ItemUOM(TenantEntity):
    """واحد اندازه‌گیری کالا — تبدیل نسبت به Base UOM."""
    item_id: Optional[UUID] = None
    uom_id: Optional[UUID] = None
    conversion_factor: float = 1.0
    is_base_uom: bool = False
    is_purchase_uom: bool = False
    is_sales_uom: bool = False
    is_stock_uom: bool = False
    barcode: str = ""
    is_active: bool = True
