"""
Booking and payment-related schemas
"""
from pydantic import BaseModel
from typing import Optional, List
from uuid import UUID
from datetime import datetime, date, time


class BookingBase(BaseModel):
    booking_date: date
    start_time: time
    end_time: time
    total_price: float
    status: str = 'pending'
    payment_status: str = 'pending'
    special_requests: Optional[str] = None


class BookingCreate(BookingBase):
    user_id: UUID
    beach_place_id: UUID
    terrain_id: UUID
    currency_id: int


class BookingUpdate(BookingBase):
    user_id: Optional[UUID] = None
    beach_place_id: Optional[UUID] = None
    terrain_id: Optional[UUID] = None
    currency_id: Optional[int] = None


class Booking(BookingBase):
    booking_id: UUID
    user_id: UUID
    beach_place_id: UUID
    terrain_id: UUID
    currency_id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        orm_mode = True


class ReviewBase(BaseModel):
    rating: int
    title: Optional[str] = None
    comment: Optional[str] = None
    photos: Optional[List[str]] = None
    is_approved: bool = False
    admin_response: Optional[str] = None


class ReviewCreate(ReviewBase):
    user_id: UUID
    beach_place_id: UUID
    booking_id: UUID


class ReviewUpdate(ReviewBase):
    user_id: Optional[UUID] = None
    beach_place_id: Optional[UUID] = None
    booking_id: Optional[UUID] = None


class Review(ReviewBase):
    review_id: UUID
    user_id: UUID
    beach_place_id: UUID
    booking_id: UUID
    created_at: datetime

    class Config:
        orm_mode = True


class UserWalletBase(BaseModel):
    balance: float = 0.00


class UserWalletCreate(UserWalletBase):
    user_id: UUID
    currency_id: int


class UserWalletUpdate(UserWalletBase):
    user_id: Optional[UUID] = None
    currency_id: Optional[int] = None


class UserWallet(UserWalletBase):
    wallet_id: int
    user_id: UUID
    currency_id: int
    created_at: datetime
    updated_at: datetime

    class Config:
        orm_mode = True


class WalletTransactionBase(BaseModel):
    transaction_type: str
    amount: float
    description: Optional[str] = None
    reference_id: Optional[str] = None
    payment_method: Optional[str] = None
    status: str = 'pending'


class WalletTransactionCreate(WalletTransactionBase):
    wallet_id: int
    currency_id: int


class WalletTransactionUpdate(WalletTransactionBase):
    wallet_id: Optional[int] = None
    currency_id: Optional[int] = None


class WalletTransaction(WalletTransactionBase):
    transaction_id: int
    wallet_id: int
    currency_id: int
    created_at: datetime

    class Config:
        orm_mode = True