"""
Reservation Domain Models

SQLAlchemy ORM models for reservations and related tables:
- Reservation: Main reservation entity
- ReservationStudent: Many-to-many link between reservations and students
- JugadorGasto: Player expenses/payments tracking
"""

from sqlalchemy import Column, Integer, String, Text, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
from .base import Base


class Reservation(Base):
    """Reservation model for training sessions"""
    __tablename__ = 'reservations'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    date = Column(String, nullable=False)
    time = Column(String)
    duration_minutes = Column(Integer)
    price_cents = Column(Integer, nullable=False, default=0)
    name = Column(String)
    email = Column(String)
    phone = Column(String)
    notes = Column(Text)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='SET NULL'))
    status = Column(String, nullable=False, default='confirmada')
    docente_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=True)
    paid = Column(Integer, nullable=False, default=0)
    
    # Relationships
    students = relationship("ReservationStudent", back_populates="reservation", cascade="all, delete-orphan")
    gastos = relationship("JugadorGasto", back_populates="reservation", cascade="all, delete-orphan")
    
    def __repr__(self):
        return f"<Reservation(id={self.id}, date='{self.date}', status='{self.status}')>"


class ReservationStudent(Base):
    """Many-to-many relationship between reservations and students"""
    __tablename__ = 'reservation_students'
    
    reservation_id = Column(Integer, ForeignKey('reservations.id', ondelete='CASCADE'), primary_key=True, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True, nullable=False)
    paid = Column(Integer, nullable=False, default=0)
    
    # Relationships
    reservation = relationship("Reservation", back_populates="students")
    user = relationship("User")
    
    def __repr__(self):
        return f"<ReservationStudent(reservation_id={self.reservation_id}, user_id={self.user_id}, paid={self.paid})>"


class JugadorGasto(Base):
    """Player expenses and payment tracking"""
    __tablename__ = 'jugadores_gastos'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    date = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'))
    reservation_id = Column(Integer, ForeignKey('reservations.id', ondelete='CASCADE'))
    amount_cents = Column(Integer, nullable=False)
    category = Column(String)
    concept = Column(String)
    notes = Column(Text)
    
    # Relationships
    reservation = relationship("Reservation", back_populates="gastos")
    
    def __repr__(self):
        return f"<JugadorGasto(id={self.id}, user_id={self.user_id}, amount_cents={self.amount_cents})>"
