from datetime import date,datetime
from typing import Any, Union

from fastapi import UploadFile
from pydantic import BaseModel, ConfigDict, Field
from typing import List,Optional



class EventBaseSchema(BaseModel):
    name: str
    event_start_date: date
    event_end_date: Union[date, None] = None
    event_start_time: str
    event_end_time: Union[str, None] = None
    price: float
    description: str
    location: str
    


class EventCreateSchema(EventBaseSchema):
    participant_names: List[str]
    participant_images: List[UploadFile]
    image: UploadFile


class EventUpdateSchema(EventBaseSchema):
    id: int
    image: UploadFile = Field(default=None)
    participant_names: List[str] = None
    participant_images: List[UploadFile] = None


class EventResponseSchema(EventBaseSchema):
    id: int
    image_url: Union[None, str]
    image: Union[str, None]
    participants: List=[]
    model_config = ConfigDict(from_attributes=True)


class EventCartBaseSchema(BaseModel):
    event_id: int
    no_of_participants: int
    
    

class EventCartCreateSchema(EventCartBaseSchema):
    pass

class EventCartUpdateSchema(EventCartBaseSchema):
    id: int

class EventCartResponseSchema(EventCartBaseSchema):
    id: int
    model_config = ConfigDict(from_attributes=True)


class EventPaymentSessionRequest(BaseModel):
    discount_coupon_code: Optional[str] = None
    use_wallet: bool = False
    charity: bool = False


class EventPurchaseDetailResponse(BaseModel):
    transaction_id: str
    transaction_batch_id: str = ""
    event_id: int
    event_name: str
    event_date: date
    participants_count: int
    total_amount: float
    payment_method: str
    payment_status: str = ""
    payment_date: datetime
    used_wallet_amount: float | None = 0.0
    discount_amount: float | None = 0.0
    coupon_discounted_amount: float | None = 0.0
    discount_coupon_id: int | None = None
    is_payment_completed: bool = False

class AdminEventBookingSchema(BaseModel):
    id: int
    transaction_batch_id: str
    first_name: str
    last_name: str
    email: str
    event_id: int
    event_name: str
    event_date: date
    participants_count: int
    total_amount: float
    payment_method: str
    payment_date: datetime
    used_wallet_amount: float | None = None
    discount_amount: float | None = None

    model_config = ConfigDict(from_attributes=True)

class AdminEventBookingResponse(BaseModel):
    data: List[AdminEventBookingSchema]