from datetime import date

from sqlalchemy import Column, Integer, String, Date, ForeignKey, Text, Boolean,Float
from sqlalchemy.orm import relationship

from models.base import Base, TimestampMixin


class Participant(Base, TimestampMixin):
    __tablename__ = 'participants'

    id = Column(Integer, primary_key=True, autoincrement=True)
    parent_id = Column(Integer, ForeignKey('parents.id'), nullable=True)
    first_name = Column(String(255), nullable=False)
    middle_name = Column(String(255), nullable=True)
    last_name = Column(String(255), nullable=False)
    sur_name = Column(String(255), nullable=False)
    dob = Column(Date, nullable=False)
    hashed_password = Column(String(255), nullable=False)
    address = Column(String(255), nullable=True)
    mobile_number = Column(String(255), nullable=True)
    post_code = Column(Integer, nullable=True)
    local_authority = Column(String(255), nullable=True)
    gender = Column(String(255), nullable=True)
    email = Column(String(255), nullable=True)
    emergency_contact_name = Column(String(255), nullable=True)
    emergency_contact_number = Column(String(255), nullable=True)
    medical_conditions = Column(String(255), nullable=True)
    ethnicity = Column(String(255), nullable=True)
    care_experience = Column(String(255), nullable=True)#extra
    age_above_three = Column(String(255), nullable=True)#extra
    wac_receipt = Column(String(255), nullable=True)#extra
    name_of_institution = Column(String(255), nullable=True)#extra
    how_did_you_know = Column(String(255), nullable=True)
    profile_image = Column(Text, nullable=True)
    additional_needs = Column(String(255), nullable=True)
    additional_needs_apply_to_participant = Column(String(255), nullable=True)
    in_care = Column(String(255), nullable=True)
    is_participated_in_wac = Column(String(255), nullable=True)
    photography_consent = Column(String(255), nullable=True)
    is_agree_terms_conditions = Column(Boolean, nullable=True,default=False)
    receive_emails= Column(Boolean, default=False)
    participant_code_of_conduct=Column(Boolean, default=False)
    alternative_contact_number = Column(String(255), nullable=True)#new
    alternative_contact_email = Column(String(255), nullable=True)#new
    wallet_amount=Column(Float,default=0)

    # relationship
    parent = relationship("Parent")


    @property
    def age(self):
        if self.dob:
            today = date.today()
            age = today.year - self.dob.year - ((today.month, today.day) < (self.dob.month, self.dob.day))
            return age
        else:
            return 0


    @property
    def profile_image_url(self):
        if self.profile_image:
            return f"/images/{self.profile_image}"
        return self.profile_image

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"
