from datetime import date
from typing import Optional, Union

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


class ProfileRegistrationBaseSchema(BaseModel):
    course_id: Optional[int] = None
    participant_id: Optional[int] = None
    service_programme: str
    participant: str
    first_name: str
    last_name: str
    preferred_name: Optional[str] = None
    student_email: EmailStr
    student_phone: Optional[str] = None
    date_of_birth: date
    age: int
    gender: str
    address_line1: str
    address_line2: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    postcode: Optional[str] = None
    bring_121_worker: bool = False
    additional_need_description: Optional[str] = None
    worker_details: Optional[str] = None
    primary_is_responsible: bool = False
    primary_first_name: str
    primary_last_name: str
    primary_relationship: str
    primary_address: str
    primary_postcode: Optional[str] = None
    primary_email: EmailStr
    primary_phone: str
    secondary_first_name: Optional[str] = None
    secondary_last_name: Optional[str] = None
    secondary_relationship: Optional[str] = None
    secondary_address: Optional[str] = None
    secondary_postcode: Optional[str] = None
    secondary_email: Optional[EmailStr] = None
    secondary_phone: Optional[str] = None
    communication_preference_email: Optional[bool] = False
    communication_preference_phone: Optional[bool] = False
    communication_preference_newsletter: Optional[bool] = False
    communication_preference_facebook_group: Optional[bool] = False
    school_name: Optional[str] = None
    eligible_free_school_meals: Optional[str] = False
    ethnicity: str
    religious_background: str
    english_first_language: bool
    other_languages: Optional[str] = None
    signing_systems: Optional[str] = None
    adult_speech_understanding: str
    communication_method_speech: Optional[bool] = False
    communication_method_makaton: Optional[bool] = False
    communication_method_vocalisation_sounds: Optional[bool] = False
    communication_method_gestures: Optional[bool] = False
    communication_method_bsl: Optional[bool] = False
    communication_help_notes: Optional[str] = None
    favourites_and_interests: Optional[str] = None
    dislikes: Optional[str] = None  
    emotional_support_triggers: Optional[str] = None
    sensitive_to_noise_or_light: Optional[str] = False
    dietary_requirements: Optional[str] = None
    help_with_eating_or_drinking: Optional[str] = False
    gp_practice: str
    gp_name: str
    gp_address_line1: str
    gp_address_line2: Optional[str] = None
    gp_city: Optional[str] = None
    gp_state: Optional[str] = None
    gp_postcode: Optional[str] = None
    gp_email: Optional[EmailStr] = None
    gp_phone: Optional[str] = None
    visual_impairment: bool = False
    visual_impairment_details: Optional[str] = None
    hearing_impairment: bool = False
    hearing_impairment_details: Optional[str] = None
    epilepsy: bool = False
    epilepsy_details: Optional[str] = None
    mental_health_needs: bool = False
    mental_health_details: Optional[str] = None
    other_info_notes: Optional[str] = None
    prn_medication: bool = False
    prn_medication_details: Optional[str] = None
    other_medication: bool = False
    other_medication_details: Optional[str] = None
    other_medical_conditions_allergies: Optional[str] = None
    travel_to_building: str
    comfort_with_new_places_people: str
    mobility_equipment: Optional[str] = None
    care_plan_epilepsy: Optional[bool] = False
    care_plan_manual_handling: Optional[bool] = False
    care_plan_dysphagia: Optional[bool] = False
    care_plan_ehcp: Optional[bool] = False
    care_plan_positive_behaviour: Optional[bool] = False
    care_plan_diabetes: Optional[bool] = False
    care_plan_other: Optional[bool] = False
    care_plan_other_details: Optional[str] = None
    consent_share_care_plans: bool = False
    consent_photo_publicity: bool = False
    consent_medical_treatment: bool = False
    mailing_list_opt_in: bool = False
    gdpr_agreed: bool = False
    model_config = ConfigDict(from_attributes=True)


class ProfileRegistrationCreateSchema(ProfileRegistrationBaseSchema):
    file: UploadFile = Field(default=None)


class ProfileRegistrationUpdateSchema(ProfileRegistrationBaseSchema):
    id: int
    file: UploadFile = Field(default=None)


class ProfileRegistrationResponseSchema(ProfileRegistrationBaseSchema):
    id: int
    file: Union[str, None]=None
    model_config = ConfigDict(from_attributes=True)


class ContentListRequestSchema(BaseModel):
    course_id: int
    user_id: int
    user_type: str
    
    model_config = ConfigDict(from_attributes=True)
