"""
Business-related schemas (Restaurants, Markets, Adventures)
"""
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from datetime import datetime, date, time
from decimal import Decimal


# Restaurant schemas
class RestaurantPhotoBase(BaseModel):
    photo_path: str
    photo_url: Optional[str] = None
    photo_caption: Optional[str] = None
    is_primary: bool = False
    photo_type: str = 'general'  # 'general', 'interior', 'exterior', 'food', 'logo'
    file_size: Optional[int] = None
    width: Optional[int] = None
    height: Optional[int] = None


class RestaurantPhotoCreate(RestaurantPhotoBase):
    restaurant_id: UUID


class RestaurantPhotoUpdate(RestaurantPhotoBase):
    restaurant_id: Optional[UUID] = None


class RestaurantPhoto(RestaurantPhotoBase):
    photo_id: UUID
    restaurant_id: UUID
    uploaded_at: datetime
    created_at: datetime

    class Config:
        orm_mode = True


class RestaurantBase(BaseModel):
    restaurant_name: str
    description: Optional[str] = None
    cuisine_type: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    country_id: Optional[int] = None
    latitude: Optional[Decimal] = None
    longitude: Optional[Decimal] = None
    opening_time: Optional[time] = None
    closing_time: Optional[time] = None
    is_active: bool = True


class RestaurantCreate(RestaurantBase):
    company_id: UUID
    beach_place_id: UUID


class RestaurantUpdate(RestaurantBase):
    company_id: Optional[UUID] = None
    beach_place_id: Optional[UUID] = None


class Restaurant(RestaurantBase):
    restaurant_id: UUID
    company_id: UUID
    beach_place_id: UUID
    created_at: datetime

    class Config:
        orm_mode = True


class RestaurantCategoryBase(BaseModel):
    category_name: str
    description: Optional[str] = None
    sort_order: int = 0


class RestaurantCategoryCreate(RestaurantCategoryBase):
    restaurant_id: UUID


class RestaurantCategoryUpdate(RestaurantCategoryBase):
    restaurant_id: Optional[UUID] = None


class RestaurantCategory(RestaurantCategoryBase):
    category_id: int
    restaurant_id: UUID

    class Config:
        orm_mode = True


class RestaurantItemBase(BaseModel):
    item_name: str
    description: Optional[str] = None
    price: float
    photo_path: Optional[str] = None
    is_available: bool = True
    preparation_time: Optional[int] = None
    allergens: Optional[str] = None
    is_vegetarian: bool = False
    is_vegan: bool = False


class RestaurantItemCreate(RestaurantItemBase):
    restaurant_id: UUID
    category_id: int
    currency_id: int


class RestaurantItemUpdate(RestaurantItemBase):
    restaurant_id: Optional[UUID] = None
    category_id: Optional[int] = None
    currency_id: Optional[int] = None


class RestaurantItem(RestaurantItemBase):
    item_id: UUID
    restaurant_id: UUID
    category_id: int
    currency_id: int
    created_at: datetime

    class Config:
        orm_mode = True


# Market schemas
class MarketBase(BaseModel):
    market_name: str
    description: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    country_id: Optional[int] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    website: Optional[str] = None
    opening_time: Optional[time] = None
    closing_time: Optional[time] = None
    delivery_available: bool = True
    delivery_fee: float = 0
    min_order_amount: float = 0
    is_active: bool = True


class MarketCreate(MarketBase):
    company_id: UUID
    beach_place_id: UUID


class MarketUpdate(MarketBase):
    company_id: Optional[UUID] = None
    beach_place_id: Optional[UUID] = None


class Market(MarketBase):
    market_id: UUID
    company_id: UUID
    beach_place_id: UUID
    created_at: datetime
    updated_at: Optional[datetime] = None

    class Config:
        orm_mode = True


class MarketCategoryBase(BaseModel):
    category_name: str
    description: Optional[str] = None
    sort_order: int = 0


class MarketCategoryCreate(MarketCategoryBase):
    market_id: UUID


class MarketCategoryUpdate(MarketCategoryBase):
    market_id: Optional[UUID] = None


class MarketCategory(MarketCategoryBase):
    category_id: int
    market_id: UUID

    class Config:
        orm_mode = True


class MarketItemBase(BaseModel):
    item_name: str
    description: Optional[str] = None
    price: float
    photo_path: Optional[str] = None
    stock_quantity: int = 0
    is_available: bool = True
    brand: Optional[str] = None
    barcode: Optional[str] = None


class MarketItemCreate(MarketItemBase):
    market_id: UUID
    category_id: int
    currency_id: int


class MarketItemUpdate(MarketItemBase):
    market_id: Optional[UUID] = None
    category_id: Optional[int] = None
    currency_id: Optional[int] = None


class MarketItem(MarketItemBase):
    item_id: UUID
    market_id: UUID
    category_id: int
    currency_id: int
    created_at: datetime

    class Config:
        orm_mode = True


# Adventure schemas
class AdventureBase(BaseModel):
    adventure_name: str
    description: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    country_id: Optional[int] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    website: Optional[str] = None
    duration_minutes: Optional[int] = None
    max_participants: Optional[int] = None
    min_participants: int = 1
    price: float
    equipment_provided: Optional[str] = None
    requirements: Optional[str] = None
    safety_instructions: Optional[str] = None
    photo_path: Optional[str] = None
    is_active: bool = True


class AdventureCreate(AdventureBase):
    company_id: UUID
    beach_place_id: UUID
    currency_id: int


class AdventureUpdate(AdventureBase):
    company_id: Optional[UUID] = None
    beach_place_id: Optional[UUID] = None
    currency_id: Optional[int] = None


class Adventure(AdventureBase):
    adventure_id: UUID
    company_id: UUID
    beach_place_id: UUID
    currency_id: int
    created_at: datetime
    updated_at: Optional[datetime] = None

    class Config:
        orm_mode = True


class AdventureScheduleBase(BaseModel):
    date: date
    start_time: time
    available_spots: int
    is_cancelled: bool = False


class AdventureScheduleCreate(AdventureScheduleBase):
    adventure_id: UUID


class AdventureScheduleUpdate(AdventureScheduleBase):
    adventure_id: Optional[UUID] = None


class AdventureSchedule(AdventureScheduleBase):
    schedule_id: int
    adventure_id: UUID

    class Config:
        orm_mode = True


# Market Photo schemas
class MarketPhotoBase(BaseModel):
    photo_url: Optional[str] = None
    photo_caption: Optional[str] = None
    is_primary: bool = False
    photo_type: str = 'general'  # 'general', 'interior', 'exterior', 'products', 'logo'
    file_size: Optional[int] = None
    width: Optional[int] = None
    height: Optional[int] = None


class MarketPhotoCreate(MarketPhotoBase):
    market_id: UUID
    photo_path: str


class MarketPhotoUpdate(MarketPhotoBase):
    market_id: Optional[UUID] = None
    photo_path: Optional[str] = None


class MarketPhoto(MarketPhotoBase):
    photo_id: UUID
    market_id: UUID
    photo_path: str
    uploaded_at: datetime
    created_at: datetime

    class Config:
        orm_mode = True


# Adventure Photo schemas
class AdventurePhotoBase(BaseModel):
    photo_url: Optional[str] = None
    photo_caption: Optional[str] = None
    is_primary: bool = False
    photo_type: str = 'general'  # 'general', 'equipment', 'location', 'action', 'logo'
    file_size: Optional[int] = None
    width: Optional[int] = None
    height: Optional[int] = None


class AdventurePhotoCreate(AdventurePhotoBase):
    adventure_id: UUID
    photo_path: str


class AdventurePhotoUpdate(AdventurePhotoBase):
    adventure_id: Optional[UUID] = None
    photo_path: Optional[str] = None


class AdventurePhoto(AdventurePhotoBase):
    photo_id: UUID
    adventure_id: UUID
    photo_path: str
    uploaded_at: datetime
    created_at: datetime

    class Config:
        orm_mode = True