from sqlalchemy import Column, String, Integer, Float, Boolean, DateTime, Time, ForeignKey, Text, Index
from sqlalchemy.orm import relationship
from datetime import datetime
import uuid
from utils.utils import Base


class Hotel(Base):
    __tablename__ = "hotels"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    service_provider_id = Column(String(36), ForeignKey("service_providers.id", ondelete="RESTRICT"), nullable=False, index=True)
    name = Column(String(255), nullable=False)
    star_rating = Column(Integer, nullable=True)
    address_line1 = Column(String(255), nullable=True)
    address_line2 = Column(String(255), nullable=True)
    city = Column(String(100), nullable=True)
    state = Column(String(100), nullable=True)
    country = Column(String(100), nullable=True)
    postal_code = Column(String(20), nullable=True)
    latitude = Column(Float, nullable=True)
    longitude = Column(Float, nullable=True)
    phone = Column(String(50), nullable=True)
    email = Column(String(255), nullable=True)
    website = Column(String(255), nullable=True)
    check_in_time = Column(Time, nullable=True)
    check_out_time = Column(Time, nullable=True)
    description = Column(Text, nullable=True)
    policies = Column(Text, nullable=True)
    is_active = Column(Boolean, nullable=False, default=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    service_provider = relationship("Serviceprovider", back_populates="hotels")
    hotel_amenities = relationship("Hotelamenity", back_populates="hotel", cascade="all, delete-orphan", passive_deletes=True)
    room_types = relationship("Roomtype", back_populates="hotel", cascade="all, delete-orphan", passive_deletes=True)
    tour_schedule_hotels = relationship("Tourschedulehotel", back_populates="hotel")


class Hotelamenity(Base):
    __tablename__ = "hotel_amenities"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    hotel_id = Column(String(36), ForeignKey("hotels.id", ondelete="CASCADE"), nullable=False, index=True)
    amenity_id = Column(String(36), ForeignKey("amenities.id", ondelete="RESTRICT"), nullable=False, index=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    hotel = relationship("Hotel", back_populates="hotel_amenities")
    amenity = relationship("Amenity", back_populates="hotel_amenities")


class Roomtype(Base):
    __tablename__ = "room_types"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    hotel_id = Column(String(36), ForeignKey("hotels.id", ondelete="CASCADE"), nullable=False, index=True)
    name = Column(String(255), nullable=False)
    description = Column(Text, nullable=True)
    max_occupancy = Column(Integer, nullable=False)
    bed_configuration = Column(String(255), nullable=True)
    room_size_sqm = Column(Float, nullable=True)
    price_per_night = Column(Float, nullable=False)
    total_rooms = Column(Integer, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    hotel = relationship("Hotel", back_populates="room_types")
    tour_schedule_hotels = relationship("Tourschedulehotel", back_populates="room_type")


class Transportation(Base):
    __tablename__ = "transportations"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    service_provider_id = Column(String(36), ForeignKey("service_providers.id", ondelete="RESTRICT"), nullable=False, index=True)
    transport_type = Column(String(50), nullable=False)
    vehicle_name = Column(String(255), nullable=True)
    vehicle_number = Column(String(100), nullable=True)
    capacity = Column(Integer, nullable=False)
    amenities = Column(Text, nullable=True)
    is_active = Column(Boolean, nullable=False, default=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    service_provider = relationship("Serviceprovider", back_populates="transportations")
    tour_schedule_transportations = relationship("Tourscheduletransportation", back_populates="transportation")