"""
Legal Entity - Domain Entity

شخصیت حقوقی ثبت‌شده با اطلاعات مالیاتی و حقوقی.
"""
from dataclasses import dataclass, field
from datetime import date, datetime
from typing import Optional
from uuid import UUID, uuid4

from shared.base_classes.entity import TenantEntity


@dataclass
class LegalEntity(TenantEntity):
    """
    شخصیت حقوقی - Legal Entity.

    شامل اطلاعات ثبتی، مالیاتی و حقوقی سازمان.
    هر Legal Entity مالک یک یا چند واحد سازمانی است.

    Rules:
    - شماره ثبت و شناسه ملی باید یکتا باشند
    - تاریخ ثبت نمی‌تواند در آینده باشد
    - نام باید حداقل ۲ کاراکتر باشد
    """

    name: str = ""
    name_en: str = ""
    registration_number: str = ""
    national_id: str = ""
    economic_code: str = ""
    registration_date: Optional[date] = None
    entity_type: str = "COMPANY"  # COMPANY, BRANCH, REPRESENTATIVE
    parent_entity_id: Optional[UUID] = None
    address: str = ""
    phone: str = ""
    fax: str = ""
    email: str = ""
    website: str = ""
    postal_code: str = ""
    city: str = ""
    province: str = ""
    country: str = "IR"
    is_active: bool = True
    metadata: dict = field(default_factory=dict)

    def validate(self) -> None:
        """اعتبارسنجی قوانین کسب‌وکار."""
        if not self.name or len(self.name) < 2:
            raise ValueError("نام شخصیت حقوقی باید حداقل ۲ کاراکتر باشد")
        if not self.registration_number:
            raise ValueError("شماره ثبت الزامی است")
        if not self.national_id:
            raise ValueError("شناسه ملی الزامی است")
        if self.registration_date and self.registration_date > date.today():
            raise ValueError("تاریخ ثبت نمی‌تواند در آینده باشد")

    def can_deactivate(self) -> bool:
        """بررسی امکان غیرفعال‌سازی."""
        return self.is_active

    def deactivate(self) -> None:
        """غیرفعال‌سازی شخصیت حقوقی."""
        if not self.can_deactivate():
            raise ValueError("شخصیت حقوقی قبلاً غیرفعال شده است")
        self.is_active = False
        self.mark_updated()
