"""
Statistics and configuration models.
"""
from sqlalchemy import Column, String, Integer, Float, Boolean, ForeignKey, Date
from sqlalchemy.orm import relationship

from app.models.base import BaseModel


class TaxRate(BaseModel):
    """
    Tax rate configuration.

    Attributes:
        name: Tax name (e.g., "TVA Standard", "TVA Réduite")
        name_en: Tax name in English
        rate: Tax rate percentage
        code: Tax code for invoicing
        is_default: Whether this is the default tax rate
        is_active: Whether tax rate is active
    """
    __tablename__ = "tax_rates"

    name = Column(String(100), nullable=False)
    name_en = Column(String(100), nullable=True)
    rate = Column(Float, nullable=False)
    code = Column(String(20), unique=True, nullable=False, index=True)
    is_default = Column(Boolean, default=False, nullable=False)
    is_active = Column(Boolean, default=True, nullable=False)

    def __repr__(self) -> str:
        return f"<TaxRate {self.code}: {self.rate}%>"


class DailyStats(BaseModel):
    """
    Daily statistics snapshot for reporting.

    Aggregated daily data for quick reporting access.
    Generated at end of each day or on-demand.

    Attributes:
        establishment_id: Associated establishment
        stat_date: Statistics date
        rooms_available: Total rooms available
        rooms_sold: Rooms sold/occupied
        rooms_out_of_order: Rooms out of order
        nights_sold: Total guest nights
        arrivals: Number of arrivals
        departures: Number of departures
        in_house: Guests in house
        revenue_accommodation: Accommodation revenue
        revenue_fb: Food & beverage revenue
        revenue_other: Other revenue
        revenue_total: Total revenue
        adr: Average daily rate
        revpar: Revenue per available room
        occupancy_rate: Occupancy percentage
    """
    __tablename__ = "daily_stats"

    establishment_id = Column(
        Integer,
        ForeignKey("establishments.id", ondelete="CASCADE"),
        nullable=False,
        index=True
    )
    stat_date = Column(Date, nullable=False, index=True)

    # Room statistics
    rooms_available = Column(Integer, default=0, nullable=False)
    rooms_sold = Column(Integer, default=0, nullable=False)
    rooms_out_of_order = Column(Integer, default=0, nullable=False)
    rooms_complimentary = Column(Integer, default=0, nullable=False)

    # Guest statistics
    nights_sold = Column(Integer, default=0, nullable=False)
    arrivals = Column(Integer, default=0, nullable=False)
    departures = Column(Integer, default=0, nullable=False)
    in_house = Column(Integer, default=0, nullable=False)
    no_shows = Column(Integer, default=0, nullable=False)
    cancellations = Column(Integer, default=0, nullable=False)

    # Revenue by department
    revenue_accommodation = Column(Float, default=0.0, nullable=False)
    revenue_fb = Column(Float, default=0.0, nullable=False)
    revenue_boutique = Column(Float, default=0.0, nullable=False)
    revenue_other = Column(Float, default=0.0, nullable=False)
    revenue_total = Column(Float, default=0.0, nullable=False)

    # KPIs
    adr = Column(Float, default=0.0, nullable=False)
    revpar = Column(Float, default=0.0, nullable=False)
    occupancy_rate = Column(Float, default=0.0, nullable=False)
    frequency_index = Column(Float, default=0.0, nullable=False)
    average_guest_revenue = Column(Float, default=0.0, nullable=False)

    # Relationships
    establishment = relationship("Establishment", back_populates="daily_stats")

    class Meta:
        unique_together = [['establishment_id', 'stat_date']]

    def __repr__(self) -> str:
        return f"<DailyStats {self.stat_date}: OCC={self.occupancy_rate}%>"
