"""
Warehouse Domain Entities — Warehouse, StorageLocation, ItemWarehouse.
"""
from dataclasses import dataclass, field
from enum import Enum
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class WarehouseType(str, Enum):
    PHYSICAL = "PHYSICAL"
    VIRTUAL = "VIRTUAL"
    TRANSIT = "TRANSIT"
    QUARANTINE = "QUARANTINE"


class LocationType(str, Enum):
    ZONE = "ZONE"
    AISLE = "AISLE"
    RACK = "RACK"
    SHELF = "SHELF"
    BIN = "BIN"


@dataclass
class Warehouse(TenantEntity):
    """انبار — Aggregate Root."""

    warehouse_code: str = ""
    warehouse_name: str = ""
    company_id: Optional[UUID] = None
    warehouse_type: WarehouseType = WarehouseType.PHYSICAL

    # Address
    address: str = ""
    city: str = ""
    province: str = ""
    country: str = "IR"
    postal_code: str = ""
    phone: str = ""
    email: str = ""

    # Manager
    manager_user_id: Optional[UUID] = None

    # Settings
    is_negative_stock_allowed: bool = False
    is_active: bool = True

    # HRM Location reference (optional)
    hrm_location_id: Optional[UUID] = None


@dataclass
class StorageLocation(TenantEntity):
    """مکان ذخیره‌سازی — سلسله‌مراتبی."""

    location_code: str = ""
    location_name: str = ""
    warehouse_id: Optional[UUID] = None
    parent_location_id: Optional[UUID] = None
    location_type: LocationType = LocationType.ZONE
    level: int = 0

    # Capabilities
    is_picking_location: bool = False
    is_putaway_location: bool = False

    # Capacity
    max_weight_kg: Optional[float] = None
    max_volume_cbm: Optional[float] = None
    temperature: Optional[float] = None
    is_hazardous_zone: bool = False

    is_active: bool = True


@dataclass
class ItemWarehouse(TenantEntity):
    """تنظیمات کالا در انبار خاص."""

    item_id: Optional[UUID] = None
    warehouse_id: Optional[UUID] = None

    # Reorder
    min_stock_level: float = 0
    max_stock_level: float = 0
    reorder_point: float = 0
    safety_stock: float = 0
    reorder_quantity: float = 0

    # Default location
    default_storage_location_id: Optional[UUID] = None
    is_active: bool = True
