from sqlalchemy import Column, String, Numeric, Date, DateTime, ForeignKey, Text, Enum as SqlEnum, Index
from sqlalchemy.orm import relationship
from utils.utils import Base
from datetime import datetime
import uuid

class Expense(Base):
    __tablename__ = "expenses"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    tour_schedule_id = Column(String(36), ForeignKey("tour_schedules.id", ondelete="SET NULL"), nullable=True, index=True)
    category = Column(String(100), nullable=False)
    description = Column(String(500), nullable=False)
    amount = Column(Numeric(12, 2), nullable=False)
    currency = Column(String(3), nullable=False)
    vendor_name = Column(String(255), nullable=True)
    expense_date = Column(Date, nullable=False)
    payment_method = Column(String(50), nullable=True)
    receipt_url = Column(String(500), nullable=True)
    status = Column(String(50), nullable=False)
    submitted_by = Column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False, index=True)
    approved_by = Column(String(36), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
    approval_date = Column(DateTime, nullable=True)
    notes = Column(Text, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    tour_schedule = relationship("Tourschedule", back_populates="expenses")
    submitter = relationship("User", foreign_keys=[submitted_by], back_populates="submitted_expenses")
    approver = relationship("User", foreign_keys=[approved_by], back_populates="approved_expenses")

    __table_args__ = (
        Index("ix_expenses_status_date", "status", "expense_date"),
    )


class Commission(Base):
    __tablename__ = "commissions"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    booking_id = Column(String(36), ForeignKey("bookings.id", ondelete="RESTRICT"), nullable=False, index=True)
    booking_agent_id = Column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False, index=True)
    booking_amount = Column(Numeric(12, 2), nullable=False)
    commission_rate = Column(Numeric(5, 2), nullable=False)
    commission_amount = Column(Numeric(12, 2), nullable=False)
    status = Column(String(50), nullable=False)
    payment_date = Column(Date, nullable=True)
    notes = Column(Text, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    booking = relationship("Booking", back_populates="commissions")
    booking_agent = relationship("User", back_populates="commissions")

    __table_args__ = (
        Index("ix_commissions_status_agent", "status", "booking_agent_id"),
    )