import uuid
from sqlalchemy import Column, String, Date, Time, Integer, Text, DateTime, ForeignKey, Enum as SqlEnum
from sqlalchemy.orm import relationship
from utils.utils import Base, utc_now, AppointmentType, AppointmentStatus


class Appointment(Base):
    __tablename__ = "appointments"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    patient_id = Column(String(36), ForeignKey("patients.id", ondelete="CASCADE"), nullable=False, index=True)
    doctor_id = Column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False, index=True)
    department_id = Column(String(36), ForeignKey("departments.id", ondelete="SET NULL"), nullable=True, index=True)
    appointment_date = Column(Date, nullable=False)
    appointment_time = Column(Time, nullable=False)
    duration_minutes = Column(Integer, nullable=False, default=30)
    appointment_type = Column(SqlEnum(AppointmentType, name="appointmenttype_enum"), nullable=False)
    status = Column(SqlEnum(AppointmentStatus, name="appointmentstatus_enum"), nullable=False)
    reason = Column(Text, nullable=True)
    notes = Column(Text, nullable=True)
    created_at = Column(DateTime(timezone=True), default=utc_now, nullable=False)
    updated_at = Column(DateTime(timezone=True), default=utc_now, onupdate=utc_now, nullable=False)

    patient = relationship("Patient", back_populates="appointments")
    doctor = relationship("User", foreign_keys=[doctor_id], back_populates="appointments_as_doctor")
    department = relationship("Department", back_populates="appointments")
    consultation = relationship("Consultation", back_populates="appointment", uselist=False)
    invoices = relationship("Invoice", back_populates="appointment")