"""
Booking and payment-related database models
"""
from sqlalchemy import Column, Integer, BigInteger, String, Boolean, DateTime, Text, ForeignKey, DECIMAL, Date, Time, ARRAY
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 Booking(Base):
    __tablename__ = "bookings"

    booking_id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
    user_id = Column(PG_UUID(as_uuid=True), ForeignKey("users.user_id"))
    beach_place_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_places.beach_place_id"))
    terrain_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_place_terrains.terrain_id"))
    booking_date = Column(Date, nullable=False)
    start_time = Column(Time, nullable=False)
    end_time = Column(Time, nullable=False)
    total_price = Column(DECIMAL(10, 2), nullable=False)
    currency_id = Column(BigInteger, ForeignKey("currencies.currency_id"))
    status = Column(String(20), default='pending')  # 'pending', 'confirmed', 'cancelled', 'completed'
    payment_status = Column(String(20), default='pending')  # 'pending', 'paid', 'refunded'
    special_requests = Column(Text)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

    # Relationships
    user = relationship("User", back_populates="bookings")
    beach_place = relationship("BeachPlace", back_populates="bookings")
    terrain = relationship("BeachPlaceTerrain", back_populates="bookings")
    currency = relationship("Currency")
    reviews = relationship("Review", back_populates="booking")


class Review(Base):
    __tablename__ = "reviews"

    review_id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
    user_id = Column(PG_UUID(as_uuid=True), ForeignKey("users.user_id"))
    beach_place_id = Column(PG_UUID(as_uuid=True), ForeignKey("beach_places.beach_place_id"))
    booking_id = Column(PG_UUID(as_uuid=True), ForeignKey("bookings.booking_id"))
    rating = Column(Integer, nullable=False)  # 1-5 stars
    title = Column(String(100))
    comment = Column(Text)
    photos = Column(ARRAY(String))  # Array of photo paths
    is_approved = Column(Boolean, default=False)
    admin_response = Column(Text)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

    # Relationships
    user = relationship("User", back_populates="reviews")
    beach_place = relationship("BeachPlace", back_populates="reviews")
    booking = relationship("Booking", back_populates="reviews")

    __table_args__ = (
        {"extend_existing": True},
    )


class UserWallet(Base):
    __tablename__ = "user_wallets"

    wallet_id = Column(BigInteger, primary_key=True, index=True)
    user_id = Column(PG_UUID(as_uuid=True), ForeignKey("users.user_id"), unique=True)
    balance = Column(DECIMAL(12, 2), default=0.00)
    currency_id = Column(BigInteger, ForeignKey("currencies.currency_id"))
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

    # Relationships
    user = relationship("User", back_populates="wallet")
    currency = relationship("Currency")
    transactions = relationship("WalletTransaction", back_populates="wallet")


class WalletTransaction(Base):
    __tablename__ = "wallet_transactions"

    transaction_id = Column(BigInteger, primary_key=True, index=True)
    wallet_id = Column(BigInteger, ForeignKey("user_wallets.wallet_id"))
    transaction_type = Column(String(20), nullable=False)  # 'deposit', 'withdrawal', 'payment', 'refund'
    amount = Column(DECIMAL(12, 2), nullable=False)
    currency_id = Column(BigInteger, ForeignKey("currencies.currency_id"))
    description = Column(Text)
    reference_id = Column(String(100))  # External payment reference
    payment_method = Column(String(30))  # 'credit_card', 'paypal', 'wechat', 'alipay', 'crypto', 'google_pay'
    status = Column(String(20), default='pending')  # 'pending', 'completed', 'failed', 'cancelled'
    created_at = Column(DateTime(timezone=True), server_default=func.now())

    # Relationships
    wallet = relationship("UserWallet", back_populates="transactions")
    currency = relationship("Currency")