"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from enum import Enum
from gusto_embedded.types import BaseModel
from typing import List, Optional
from typing_extensions import NotRequired, TypedDict


class ID(str, Enum):
    r"""The string identifier for each onboarding step"""

    ADD_ADDRESSES = "add_addresses"
    FEDERAL_TAX_SETUP = "federal_tax_setup"
    SELECT_INDUSTRY = "select_industry"
    ADD_BANK_INFO = "add_bank_info"
    ADD_EMPLOYEES = "add_employees"
    STATE_SETUP = "state_setup"
    PAYROLL_SCHEDULE = "payroll_schedule"
    SIGN_ALL_FORMS = "sign_all_forms"
    VERIFY_BANK_INFO = "verify_bank_info"
    EXTERNAL_PAYROLL = "external_payroll"


class Requirements(str, Enum):
    ADD_ADDRESSES = "add_addresses"
    FEDERAL_TAX_SETUP = "federal_tax_setup"
    SELECT_INDUSTRY = "select_industry"
    ADD_BANK_INFO = "add_bank_info"
    ADD_EMPLOYEES = "add_employees"
    STATE_SETUP = "state_setup"
    PAYROLL_SCHEDULE = "payroll_schedule"
    SIGN_ALL_FORMS = "sign_all_forms"
    VERIFY_BANK_INFO = "verify_bank_info"
    EXTERNAL_PAYROLL = "external_payroll"


class OnboardingStepTypedDict(TypedDict):
    title: NotRequired[str]
    r"""The display name of the onboarding step"""
    id: NotRequired[ID]
    r"""The string identifier for each onboarding step"""
    required: NotRequired[bool]
    r"""The boolean flag indicating whether the step is required or optional"""
    completed: NotRequired[bool]
    r"""The boolean flag indicating whether the step is completed or not."""
    skippable: NotRequired[bool]
    r"""The boolean flag indicating whether the step can be skipped or not."""
    requirements: NotRequired[List[Requirements]]
    r"""A list of onboarding step that are required to be completed in order to proceed with the current onboarding step."""


class OnboardingStep(BaseModel):
    title: Optional[str] = None
    r"""The display name of the onboarding step"""

    id: Optional[ID] = None
    r"""The string identifier for each onboarding step"""

    required: Optional[bool] = None
    r"""The boolean flag indicating whether the step is required or optional"""

    completed: Optional[bool] = None
    r"""The boolean flag indicating whether the step is completed or not."""

    skippable: Optional[bool] = None
    r"""The boolean flag indicating whether the step can be skipped or not."""

    requirements: Optional[List[Requirements]] = None
    r"""A list of onboarding step that are required to be completed in order to proceed with the current onboarding step."""


class CompanyOnboardingStatusTypedDict(TypedDict):
    r"""The representation of a company's onboarding status"""

    uuid: str
    r"""the UUID of the company"""
    onboarding_completed: NotRequired[bool]
    r"""a boolean flag for the company's onboarding status"""
    onboarding_steps: NotRequired[List[OnboardingStepTypedDict]]
    r"""a list of company onboarding steps"""


class CompanyOnboardingStatus(BaseModel):
    r"""The representation of a company's onboarding status"""

    uuid: str
    r"""the UUID of the company"""

    onboarding_completed: Optional[bool] = None
    r"""a boolean flag for the company's onboarding status"""

    onboarding_steps: Optional[List[OnboardingStep]] = None
    r"""a list of company onboarding steps"""
