"""
Location - Domain Entity

مدیریت مکان‌های فیزیکی سازمان (دفاتر، کارخانه‌ها، شعب).
"""
from dataclasses import dataclass, field
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class LocationType:
    """انواع مکان."""
    HEADQUARTERS = "HEADQUARTERS"
    OFFICE = "OFFICE"
    FACTORY = "FACTORY"
    WAREHOUSE = "WAREHOUSE"
    BRANCH = "BRANCH"
    REMOTE = "REMOTE"
    HYBRID = "HYBRID"


@dataclass
class Location(TenantEntity):
    """
    مکان فیزیکی سازمان.

    شامل دفاتر، کارخانه‌ها، شعب و مکان‌های کاری.

    Rules:
    - هر مکان باید نام و کد یکتا داشته باشد
    - مختصات جغرافیایی اختیاری
    - ظرفیت باید مثبت باشد
    """

    name: str = ""
    code: str = ""
    location_type: str = LocationType.OFFICE
    legal_entity_id: Optional[UUID] = None
    org_unit_id: Optional[UUID] = None
    address: str = ""
    city: str = ""
    province: str = ""
    country: str = "IR"
    postal_code: str = ""
    phone: str = ""
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    capacity: int = 0
    timezone: str = "Asia/Tehran"
    is_active: bool = True
    metadata: dict = field(default_factory=dict)

    def validate(self) -> None:
        """اعتبارسنجی قوانین کسب‌وکار."""
        if not self.name:
            raise ValueError("نام مکان الزامی است")
        if not self.code:
            raise ValueError("کد مکان الزامی است")
        if self.capacity < 0:
            raise ValueError("ظرفیت نمی‌تواند منفی باشد")

    def has_coordinates(self) -> bool:
        """بررسی وجود مختصات جغرافیایی."""
        return self.latitude is not None and self.longitude is not None
