from decimal import Decimal
from typing import Any, List, Optional

from bullhorn.types import category, corporate_user, person


class Candidate(person.Person):
    id: int
    address: str
    blacklistClientCorporations: List[int]
    businessSectors: List[int]
    candidateSource: str
    category: category.Category
    categories: List[int]
    certifications: str
    clientRating: Optional[int]
    comments: str
    companyName: str
    companyURL: str
    customDate1: Optional[int]
    customDate2: Optional[int]
    customDate3: Optional[int]
    customDate4: Optional[int]
    customDate5: Optional[int]
    customDate6: Optional[int]
    customDate7: Optional[int]
    customDate8: Optional[int]
    customDate9: Optional[int]
    customDate10: Optional[int]
    customDate11: Optional[int]
    customDate12: Optional[int]
    customDate13: Optional[int]
    customEncryptedText1: str
    customEncryptedText2: str
    customEncryptedText3: str
    customEncryptedText4: str
    customEncryptedText5: str
    customEncryptedText6: str
    customEncryptedText7: str
    customEncryptedText8: str
    customEncryptedText9: str
    customEncryptedText10: str
    customFloat1: Optional[float]
    customFloat2: Optional[float]
    customFloat3: Optional[float]
    customFloat4: Optional[float]
    customFloat5: Optional[float]
    customFloat6: Optional[float]
    customFloat7: Optional[float]
    customFloat8: Optional[float]
    customFloat9: Optional[float]
    customFloat10: Optional[float]
    customFloat11: Optional[float]
    customFloat12: Optional[float]
    customFloat13: Optional[float]
    customFloat14: Optional[float]
    customFloat15: Optional[float]
    customFloat16: Optional[float]
    customFloat17: Optional[float]
    customFloat18: Optional[float]
    customFloat19: Optional[float]
    customFloat20: Optional[float]
    customFloat21: Optional[float]
    customFloat22: Optional[float]
    customFloat23: Optional[float]
    customInt1: Optional[int]
    customInt2: Optional[int]
    customInt3: Optional[int]
    customInt4: Optional[int]
    customInt5: Optional[int]
    customInt6: Optional[int]
    customInt7: Optional[int]
    customInt8: Optional[int]
    customInt9: Optional[int]
    customInt10: Optional[int]
    customInt11: Optional[int]
    customInt12: Optional[int]
    customInt13: Optional[int]
    customInt14: Optional[int]
    customInt15: Optional[int]
    customInt16: Optional[int]
    customInt17: Optional[int]
    customInt18: Optional[int]
    customInt19: Optional[int]
    customInt20: Optional[int]
    customInt21: Optional[int]
    customInt22: Optional[int]
    customInt23: Optional[int]
    customObject1s: List[Any]
    customObject2s: List[Any]
    customObject3s: List[Any]
    customObject4s: List[Any]
    customObject5s: List[Any]
    customObject6s: List[Any]
    customObject7s: List[Any]
    customObject8s: List[Any]
    customObject9s: List[Any]
    customObject10s: List[Any]
    customText1: Optional[str]
    customText2: Optional[str]
    customText3: Optional[str]
    customText4: Optional[str]
    customText5: Optional[str]
    customText6: Optional[str]
    customText7: Optional[str]
    customText8: Optional[str]
    customText9: Optional[str]
    customText10: Optional[str]
    customText11: Optional[str]
    customText12: Optional[str]
    customText13: Optional[str]
    customText14: Optional[str]
    customText15: Optional[str]
    customText16: Optional[str]
    customText17: Optional[str]
    customText18: Optional[str]
    customText19: Optional[str]
    customText20: Optional[str]
    customText21: Optional[str]
    customText22: Optional[str]
    customText23: Optional[str]
    customTextBlock1: Optional[str]
    customTextBlock2: Optional[str]
    customTextBlock3: Optional[str]
    customTextBlock4: Optional[str]
    customTextBlock5: Optional[str]
    customTextBlock6: Optional[str]
    customTextBlock7: Optional[str]
    customTextBlock8: Optional[str]
    customTextBlock9: Optional[str]
    customTextBlock10: Optional[str]
    dateAdded: int
    dateAvailable: Optional[int]
    dateAvailableEnd: Optional[int]
    dateI9Expiration: Optional[int]
    dateLastComment: Optional[int]
    dateLastModified: int
    dateNextCall: Optional[int]
    dateOfBirth: Optional[int]
    dayRate: Optional[Decimal]
    dayRateLow: Optional[Decimal]
    degreeList: str
    description: str
    desiredLocations: str
    disability: str
    educationDegree: str
    email: Optional[str]
    email2: Optional[str]
    email3: Optional[str]
    employeeType: str
    employmentPreference: str
    ethnicity: str
    experience: Optional[int]
    externalID: str
    fax: Optional[str]
    fax2: Optional[str]
    fax3: Optional[str]
    federalAdditionalWithholdingsAmount: Optional[Decimal]
    federalExemptions: Optional[int]
    federalExtraWithholdingAmount: Optional[Decimal]
    federalFilingStatus: Optional[str]
    firstName: str
    gender: str
    hourlyRate: Optional[Decimal]
    hourlyRateLow: Optional[Decimal]
    i9OnFile: Optional[int]
    interviews: List[int]
    isAnonymized: bool
    isDeleted: bool
    isEditable: bool
    isExempt: Optional[bool]
    lastName: str
    leads: List[int]
    linkedPerson: Optional[person.Person]
    localAdditionalWithholdingsAmount: Optional[Decimal]
    localExemptions: Optional[int]
    localFilingStatus: Optional[str]
    localTaxCode: Optional[str]
    maritalStatus: str
    massMailOptOut: bool
    middleName: Optional[str]
    mobile: Optional[str]
    name: str
    namePrefix: str
    nameSuffix: str
    nickName: Optional[str]
    numCategories: Optional[int]
    numOwners: Optional[int]
    occupation: str
    onboardingDocumentReceivedCount: Optional[int]
    onboardingDocumentSentCount: Optional[int]
    onboardingPercentComplete: Optional[int]
    onboardingReceivedSent: Any
    onboardingStatus: str
    otherDeductionsAmount: Optional[Decimal]
    otherIncomeAmount: Optional[Decimal]
    owner: corporate_user.CorporateUser
    pager: Optional[str]
    paperWorkOnFile: str
    password: str
    payrollClientStartDate: Optional[int]
    payrollStatus: str
    phone: Optional[str]
    phone2: Optional[str]
    phone3: Optional[str]
    placements: List[int]
    preferredContact: str
    primarySkills: List[int]
    recentClientList: str
    referredBy: Optional[str]
    referredByPerson: Optional[person.Person]
    salary: Optional[Decimal]
    salaryLow: Optional[Decimal]
    secondaryAddress: str
    secondaryOwners: List[int]
    secondarySkills: List[int]
    sendouts: List[int]
    skillSet: str
    smsOptIn: bool
    source: str
    specialties: List[int]
    ssn: str
    stateAdditionalWithholdingsAmount: Optional[Decimal]
    stateExemptions: Optional[int]
    stateFilingStatus: Optional[str]
    status: str
    submissions: List[int]
    tasks: List[int]
    taxID: str
    taxState: str
    timeZoneOffsetEST: int
    tobaccoUser: str
    totalDependentClaimAmount: Optional[Decimal]
    travelLimit: int
    travelMethod: str
    twoJobs: bool
    type: str
    userDateAdded: int
    username: str
    veteran: str
    webResponses: List[int]
    whitelistClientCorporations: List[int]
    willRelocate: bool
    workAuthorized: bool
    workPhone: str
