"""
Beach-related database models
"""
from sqlalchemy import Column, Integer, BigInteger, String, Boolean, DateTime, Text, ForeignKey, DECIMAL, Date, Time, UUID
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
import uuid
from app.db.session import Base


class BeachTerrainType(Base):
    __tablename__ = "beach_terrain_types"

    terrain_type_id = Column(Integer, primary_key=True, index=True)
    terrain_name = Column(String(50), nullable=False)
    photo_path = Column(String(500))
    description = Column(Text)

    # Relationships
    beach_places = relationship("BeachPlace", back_populates="terrain_type")


class BeachBedType(Base):
    __tablename__ = "beach_bed_types"

    bed_type_id = Column(BigInteger, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    description = Column(Text, nullable=False)
    photo_path = Column(String(1000), nullable=False)
    uid = Column(Integer, nullable=False)
    is_layout = Column(Boolean, nullable=False, default=False)
    has_background_color = Column(Boolean, nullable=False, default=False)


class BeachPlace(Base):
    __tablename__ = "beach_places"

    beach_place_id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
    beach_name = Column(String(50), nullable=False)
    company_id = Column(PG_UUID(as_uuid=True), ForeignKey("companies.company_id"))
    mask = Column(Text, nullable=False)
    max_seats = Column(Integer, nullable=False)
    top_rows = Column(Integer, nullable=False)
    top_seats = Column(Integer, nullable=False)
    is_double_seat = Column(Boolean, nullable=False, default=False)
    has_umbrella = Column(Boolean, nullable=False, default=False)
    has_showers = Column(Boolean, nullable=False, default=False)
    has_lockers = Column(Boolean, nullable=False, default=False)
    has_market = Column(Boolean, nullable=False, default=False)
    has_restaurant = Column(Boolean, nullable=False, default=False)
    has_swimming_pool = Column(Boolean, nullable=False, default=False)
    has_parking = Column(Boolean, nullable=False, default=False)
    has_toilets = Column(Boolean, nullable=False, default=False)
    has_free_wifi = Column(Boolean, nullable=False, default=False)
    has_music = Column(Boolean, nullable=False, default=False)
    has_safety_box = Column(Boolean, nullable=False, default=False)
    has_access_wheelchair = Column(Boolean, nullable=False, default=False)
    has_lockers_for_baby = Column(Boolean, nullable=False, default=False)
    has_beach_volley = Column(Boolean, nullable=False, default=False)
    has_tennis = Column(Boolean, nullable=False, default=False)
    has_spa = Column(Boolean, nullable=False, default=False)
    has_medical = Column(Boolean, nullable=False, default=False)
    has_lifeguard = Column(Boolean, nullable=False, default=False)
    pet_allow = Column(Boolean, nullable=False, default=False)
    enable_beach = Column(Boolean, nullable=False, default=True)
    beach_information = Column(Text, nullable=False)
    address = Column(String(250), nullable=False)
    latitude = Column(DECIMAL(18, 8), nullable=False)
    longitude = Column(DECIMAL(18, 8), nullable=False)
    terrain_type_id = Column(Integer, ForeignKey("beach_terrain_types.terrain_type_id"))
    country_id = Column(Integer, ForeignKey("countries.country_id"))
    city = Column(String(50), nullable=False)
    disable_today = Column(Boolean, default=False)
    contact_phone = Column(String(50))
    starttime = Column(Time)
    endtime = Column(Time)
    opendays = Column(String(7), default='1234567')  # '1234567' for Mon-Sun
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

    # Relationships
    company = relationship("Company", back_populates="beach_places")
    terrain_type = relationship("BeachTerrainType", back_populates="beach_places")
    country = relationship("Country", back_populates="beach_places")
    photos = relationship("BeachPlacePhoto", back_populates="beach_place", cascade="all, delete-orphan")
    schedules = relationship("BeachPlaceSchedule", back_populates="beach_place", cascade="all, delete-orphan")
    terrains = relationship("BeachPlaceTerrain", back_populates="beach_place", cascade="all, delete-orphan")
    bookings = relationship("Booking", back_populates="beach_place")
    reviews = relationship("Review", back_populates="beach_place")
    restaurants = relationship("Restaurant", back_populates="beach_place")
    markets = relationship("Market", back_populates="beach_place")
    adventures = relationship("Adventure", back_populates="beach_place")


class BeachPlacePhoto(Base):
    __tablename__ = "beach_places_photos"

    photo_id = Column(BigInteger, primary_key=True, index=True)
    beach_place_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_places.beach_place_id"))
    photo_primary = Column(Boolean, nullable=False, default=False)
    photo_path = Column(String(1000), nullable=False)
    caption = Column(String(255))
    sort_order = Column(Integer, default=0)

    # Relationships
    beach_place = relationship("BeachPlace", back_populates="photos")


class BeachPlaceSchedule(Base):
    __tablename__ = "beach_places_schedules"

    schedule_id = Column(BigInteger, primary_key=True, index=True)
    beach_place_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_places.beach_place_id"))
    from_date = Column(Date, nullable=False)
    to_date = Column(Date, nullable=False)
    from_time = Column(Time, nullable=False)
    to_time = Column(Time, nullable=False)
    valid_dates = Column(String(7), nullable=False)  # '1234567' for Mon-Sun
    min_hours = Column(Integer, nullable=False)
    can_refund = Column(Boolean, nullable=False, default=False)
    refund_before_hours = Column(Integer, nullable=False, default=0)
    currency_id = Column(BigInteger, ForeignKey("currencies.currency_id"))
    price = Column(DECIMAL(10, 2), nullable=False)
    price_vip = Column(DECIMAL(10, 2), nullable=False)
    extras = Column(Text)
    extras_vip = Column(Text)

    # Relationships
    beach_place = relationship("BeachPlace", back_populates="schedules")
    currency = relationship("Currency")


class BeachPlaceTerrain(Base):
    __tablename__ = "beach_place_terrains"

    terrain_id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    uid = Column(BigInteger, nullable=False)
    beach_place_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_places.beach_place_id"))
    angle = Column(Integer, nullable=False, default=0)
    background_color = Column(String(7), nullable=False, default='#FFFFFF')
    bed_reference = Column(String(30))
    block_online = Column(Boolean, nullable=False, default=False)
    classification = Column(Integer, nullable=False, default=0)
    covers = Column(String(30))
    description = Column(Text)
    description_text = Column(Text)
    description_text_position = Column(Text)
    height = Column(DECIMAL(10, 2), nullable=False)
    left_position = Column(DECIMAL(18, 8), nullable=False)
    bed_price = Column(DECIMAL(10, 2), nullable=False, default=0)
    min_price = Column(DECIMAL(10, 2), nullable=False, default=0)
    name = Column(String(50), nullable=False)
    top_position = Column(DECIMAL(18, 8), nullable=False)
    width = Column(DECIMAL(10, 2), nullable=False)
    z_index = Column(Integer, nullable=False, default=0)
    is_layout = Column(Boolean, nullable=False, default=False)

    # Relationships
    beach_place = relationship("BeachPlace", back_populates="terrains")
    bookings = relationship("Booking", back_populates="terrain")