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

from __future__ import annotations
from ascend_sdk import utils
from ascend_sdk.types import BaseModel
from ascend_sdk.utils import validate_open_enum
from enum import Enum
from pydantic.functional_validators import PlainValidator
from typing import Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class AnnualIncomeRangeUsd(str, Enum, metaclass=utils.OpenEnumMeta):
    r"""Annual income range; the low number is exclusive, the high number is inclusive"""

    USD_RANGE_UNSPECIFIED = "USD_RANGE_UNSPECIFIED"
    UNDER_25_K = "UNDER_25K"
    FROM_25_K_TO_50_K = "FROM_25K_TO_50K"
    FROM_50_K_TO_100_K = "FROM_50K_TO_100K"
    FROM_100_K_TO_200_K = "FROM_100K_TO_200K"
    FROM_200_K_TO_300_K = "FROM_200K_TO_300K"
    FROM_300_K_TO_500_K = "FROM_300K_TO_500K"
    FROM_500_K_TO_1_M = "FROM_500K_TO_1M"
    FROM_1_M_TO_5_M = "FROM_1M_TO_5M"
    OVER_5_M = "OVER_5M"


class InvestmentExperience(str, Enum, metaclass=utils.OpenEnumMeta):
    r"""Investment experience."""

    INVESTMENT_EXPERIENCE_UNSPECIFIED = "INVESTMENT_EXPERIENCE_UNSPECIFIED"
    NONE = "NONE"
    LIMITED = "LIMITED"
    GOOD = "GOOD"
    EXTENSIVE = "EXTENSIVE"


class LiquidNetWorthRangeUsd(str, Enum, metaclass=utils.OpenEnumMeta):
    r"""Liquid net worth range; the low number is exclusive, the high number is inclusive"""

    USD_RANGE_UNSPECIFIED = "USD_RANGE_UNSPECIFIED"
    UNDER_25_K = "UNDER_25K"
    FROM_25_K_TO_50_K = "FROM_25K_TO_50K"
    FROM_50_K_TO_100_K = "FROM_50K_TO_100K"
    FROM_100_K_TO_200_K = "FROM_100K_TO_200K"
    FROM_200_K_TO_300_K = "FROM_200K_TO_300K"
    FROM_300_K_TO_500_K = "FROM_300K_TO_500K"
    FROM_500_K_TO_1_M = "FROM_500K_TO_1M"
    FROM_1_M_TO_5_M = "FROM_1M_TO_5M"
    OVER_5_M = "OVER_5M"


class TotalNetWorthRangeUsd(str, Enum, metaclass=utils.OpenEnumMeta):
    r"""Total net worth range; the low number is exclusive, the high number is inclusive"""

    USD_RANGE_UNSPECIFIED = "USD_RANGE_UNSPECIFIED"
    UNDER_25_K = "UNDER_25K"
    FROM_25_K_TO_50_K = "FROM_25K_TO_50K"
    FROM_50_K_TO_100_K = "FROM_50K_TO_100K"
    FROM_100_K_TO_200_K = "FROM_100K_TO_200K"
    FROM_200_K_TO_300_K = "FROM_200K_TO_300K"
    FROM_300_K_TO_500_K = "FROM_300K_TO_500K"
    FROM_500_K_TO_1_M = "FROM_500K_TO_1M"
    FROM_1_M_TO_5_M = "FROM_1M_TO_5M"
    OVER_5_M = "OVER_5M"


class CustomerProfileCreateTypedDict(TypedDict):
    r"""A detailed summary of financial and personal details of an investor, to help understand the investor's financial standing, investment experience and risk tolerance."""

    annual_income_range_usd: NotRequired[AnnualIncomeRangeUsd]
    r"""Annual income range; the low number is exclusive, the high number is inclusive"""
    federal_tax_bracket: NotRequired[float]
    r"""Federal tax bracket percent."""
    investment_experience: NotRequired[InvestmentExperience]
    r"""Investment experience."""
    liquid_net_worth_range_usd: NotRequired[LiquidNetWorthRangeUsd]
    r"""Liquid net worth range; the low number is exclusive, the high number is inclusive"""
    total_net_worth_range_usd: NotRequired[TotalNetWorthRangeUsd]
    r"""Total net worth range; the low number is exclusive, the high number is inclusive"""


class CustomerProfileCreate(BaseModel):
    r"""A detailed summary of financial and personal details of an investor, to help understand the investor's financial standing, investment experience and risk tolerance."""

    annual_income_range_usd: Annotated[
        Optional[AnnualIncomeRangeUsd], PlainValidator(validate_open_enum(False))
    ] = None
    r"""Annual income range; the low number is exclusive, the high number is inclusive"""

    federal_tax_bracket: Optional[float] = None
    r"""Federal tax bracket percent."""

    investment_experience: Annotated[
        Optional[InvestmentExperience], PlainValidator(validate_open_enum(False))
    ] = None
    r"""Investment experience."""

    liquid_net_worth_range_usd: Annotated[
        Optional[LiquidNetWorthRangeUsd], PlainValidator(validate_open_enum(False))
    ] = None
    r"""Liquid net worth range; the low number is exclusive, the high number is inclusive"""

    total_net_worth_range_usd: Annotated[
        Optional[TotalNetWorthRangeUsd], PlainValidator(validate_open_enum(False))
    ] = None
    r"""Total net worth range; the low number is exclusive, the high number is inclusive"""
