"""
Department model for categorizing charges and revenues.
"""
import enum
from sqlalchemy import Column, String, Enum, Boolean

from app.models.base import BaseModel


class DepartmentCategory(str, enum.Enum):
    """Department categories for reporting."""
    ACCOMMODATION = "accommodation"
    FOOD_BEVERAGE = "food_beverage"
    BOUTIQUE = "boutique"
    OTHER_REVENUE = "other_revenue"
    ADMINISTRATION = "administration"
    MAINTENANCE = "maintenance"
    ANIMATION = "animation"
    GENERAL_EXPENSES = "general_expenses"


class Department(BaseModel):
    """
    Department for categorizing hotel charges and revenues.

    Used for:
    - Folio item categorization
    - Revenue reporting by department
    - F&B ratio calculations
    - Budget tracking

    Attributes:
        code: Unique department code
        name: Department display name
        name_en: Department name in English
        category: Department category for reporting
        is_revenue: Whether this generates revenue
        is_active: Whether department is active
    """
    __tablename__ = "departments"

    code = Column(String(20), unique=True, nullable=False, index=True)
    name = Column(String(100), nullable=False)
    name_en = Column(String(100), nullable=True)
    category = Column(
        Enum(DepartmentCategory),
        default=DepartmentCategory.OTHER_REVENUE,
        nullable=False
    )
    is_revenue = Column(Boolean, default=True, nullable=False)
    is_active = Column(Boolean, default=True, nullable=False)

    def __repr__(self) -> str:
        return f"<Department {self.code}: {self.name}>"
