from datetime import date
from typing import Optional, Union

from fastapi import UploadFile
from pydantic import BaseModel, ConfigDict, EmailStr


class ParticipantBaseSchema(BaseModel):
    parent_id: Optional[int] = None
    first_name: str
    middle_name: Optional[str] = None
    last_name: str
    dob: date
    address: Optional[str] = None
    mobile_number: Optional[str] = None
    post_code: Optional[int] = None
    local_authority: Optional[str] = None
    gender: Optional[str] = None
    email: Optional[EmailStr] = None
    emergency_contact_name: Optional[str] = None
    emergency_contact_number: Optional[str] = None
    medical_conditions: Optional[str] = None
    ethnicity: Optional[str] = None
    care_experience: Optional[str] = None
    age_above_three: Optional[str] = None
    wac_receipt: Optional[str] = None
    name_of_institution: Optional[str] = None
    how_did_you_know: Optional[str] = None
    additional_needs: Optional[str] = None
    additional_needs_apply_to_participant: Optional[str] = None
    in_care: Optional[str] = None
    is_participated_in_wac: Optional[str] = None
    photography_consent: Optional[str] = None
    is_agree_terms_conditions: Optional[bool] = False
    receive_emails: Optional[bool] = False
    participant_code_of_conduct:Optional[bool] = False
    alternative_contact_number: Optional[str] = None
    alternative_contact_email: Optional[EmailStr] = None
    wallet_amount: Optional[float]=0.0
    is_active: Optional[bool] = False

class AddParticipantSchema(ParticipantBaseSchema):
    pass


class ParticipantUpdateSchema(ParticipantBaseSchema):
    id: int


class ParentSchema(BaseModel):
    full_name: str
    first_name: str
    last_name: str
    sur_name: str
    id: int
    model_config = ConfigDict(from_attributes=True)


class ParticipantResponseSchema(ParticipantBaseSchema):
    id: int
    age:Optional[int]
    profile_image: Union[str, None]
    profile_image_url: Union[str, None]
    parent: Optional[ParentSchema]

    model_config = ConfigDict(from_attributes=True)


class ParticipantProfileSchema(BaseModel):
    participant_id: int
    image: UploadFile

# new
class ParticipantProfileUpdateSchema(ParticipantBaseSchema):
    pass

class ParticipantProfileResponseSchema(ParticipantBaseSchema):
    id: int
    profile_image: Union[str, None]
    profile_image_url: Union[str, None]
    model_config = ConfigDict(from_attributes=True)


