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

from __future__ import annotations
from .versionheader import VersionHeader
from datetime import date
from enum import Enum
from gusto_embedded.types import BaseModel
from gusto_embedded.utils import (
    FieldMetadata,
    HeaderMetadata,
    PathParamMetadata,
    RequestMetadata,
)
import pydantic
from typing import List, Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class Columns(str, Enum):
    BANK_ACCOUNT_ACCOUNT_NUMBER = "bank_account_account_number"
    BANK_ACCOUNT_ROUTING_NUMBER = "bank_account_routing_number"
    BANK_ACCOUNT_TYPE = "bank_account_type"
    BANK_ACCOUNT = "bank_account"
    BONUS = "bonus"
    CASH_TIPS = "cash_tips"
    CHECK_AMOUNT = "check_amount"
    CHECK_DATE = "check_date"
    COMMISSION = "commission"
    DATE_OF_BIRTH = "date_of_birth"
    DOUBLE_OVERTIME_EARNINGS = "double_overtime_earnings"
    DOUBLE_OVERTIME_HOURS = "double_overtime_hours"
    DOUBLE_OVERTIME_RATE = "double_overtime_rate"
    EMPLOYEE_ADDITIONAL_TAXES = "employee_additional_taxes"
    EMPLOYEE_BENEFIT_CONTRIBUTIONS = "employee_benefit_contributions"
    EMPLOYEE_COMPENSATION_TIME_PERIOD = "employee_compensation_time_period"
    EMPLOYEE_COMPENSATION = "employee_compensation"
    EMPLOYEE_DEDUCTIONS = "employee_deductions"
    EMPLOYEE_DEPARTMENT = "employee_department"
    EMPLOYEE_EMAIL = "employee_email"
    EMPLOYEE_FEDERAL_INCOME_TAX = "employee_federal_income_tax"
    EMPLOYEE_FIRST_NAME = "employee_first_name"
    EMPLOYEE_LAST_NAME = "employee_last_name"
    EMPLOYEE_MIDDLE_INITIAL = "employee_middle_initial"
    EMPLOYEE_MEDICARE_ADDITIONAL_TAX = "employee_medicare_additional_tax"
    EMPLOYEE_MEDICARE_TAX = "employee_medicare_tax"
    EMPLOYEE_PHONE_NUMBER = "employee_phone_number"
    EMPLOYEE_SOCIAL_SECURITY_TAX = "employee_social_security_tax"
    EMPLOYEE_TAXES = "employee_taxes"
    EMPLOYEE_WORK_EMAIL = "employee_work_email"
    EMPLOYER_ADDITIONAL_TAXES = "employer_additional_taxes"
    EMPLOYER_BENEFIT_CONTRIBUTIONS = "employer_benefit_contributions"
    EMPLOYER_COST = "employer_cost"
    EMPLOYER_FUTA_TAX = "employer_futa_tax"
    EMPLOYER_MEDICARE_TAX = "employer_medicare_tax"
    EMPLOYER_SOCIAL_SECURITY_TAX = "employer_social_security_tax"
    EMPLOYER_SUTA_TAX = "employer_suta_tax"
    EMPLOYER_TAXES = "employer_taxes"
    EMPLOYMENT_TYPE = "employment_type"
    EMPLOYMENT = "employment"
    END_DATE = "end_date"
    GARNISHMENTS = "garnishments"
    GROSS_EARNINGS = "gross_earnings"
    HOLIDAY_EARNINGS = "holiday_earnings"
    HOLIDAY_HOURS = "holiday_hours"
    HOME_ADDRESS_CITY = "home_address_city"
    HOME_ADDRESS_STATE = "home_address_state"
    HOME_ADDRESS_STREET = "home_address_street"
    HOME_ADDRESS_ZIP = "home_address_zip"
    HOME_ADDRESS = "home_address"
    JOB_TITLE = "job_title"
    NET_PAY = "net_pay"
    ONE_TIME_REIMBURSEMENTS = "one_time_reimbursements"
    OVERTIME_EARNINGS = "overtime_earnings"
    OVERTIME_HOURS = "overtime_hours"
    OVERTIME_RATE = "overtime_rate"
    PAID_TIME_OFF_EARNINGS = "paid_time_off_earnings"
    PAID_TIME_OFF_HOURS = "paid_time_off_hours"
    PAID_TIME_OFF_RATE = "paid_time_off_rate"
    PAY_PERIOD_END = "pay_period_end"
    PAY_PERIOD_START = "pay_period_start"
    PAYCHECK_TIPS = "paycheck_tips"
    PAYMENT_METHOD = "payment_method"
    PAYROLL_TYPE = "payroll_type"
    PREFERRED_FIRST_NAME = "preferred_first_name"
    RECURRING_REIMBURSEMENTS = "recurring_reimbursements"
    REGULAR_EARNINGS = "regular_earnings"
    REGULAR_HOURS = "regular_hours"
    REGULAR_RATE = "regular_rate"
    REIMBURSEMENTS = "reimbursements"
    RISK_CLASS_CODE = "risk_class_code"
    SICK_RATE = "sick_rate"
    SICK_TIME_OFF_EARNINGS = "sick_time_off_earnings"
    SICK_TIME_OFF_HOURS = "sick_time_off_hours"
    START_DATE = "start_date"
    TOTAL_EMPLOYER_BENEFIT_CONTRIBUTIONS = "total_employer_benefit_contributions"
    TOTAL_TIME_OFF_EARNINGS = "total_time_off_earnings"
    TOTAL_TIME_OFF_HOURS = "total_time_off_hours"
    WORK_ADDRESS_CITY = "work_address_city"
    WORK_ADDRESS_STREET = "work_address_street"
    WORK_ADDRESS_ZIP = "work_address_zip"


class Groupings(str, Enum):
    PAYROLL = "payroll"
    EMPLOYEE = "employee"
    WORK_ADDRESS = "work_address"
    WORK_ADDRESS_STATE = "work_address_state"


class FileType(str, Enum):
    r"""The type of file to generate"""

    CSV = "csv"
    JSON = "json"


class PostCompaniesCompanyUUIDReportsPaymentMethod(str, Enum):
    r"""Payment method to filter by"""

    CHECK = "check"
    DIRECT_DEPOSIT = "direct_deposit"


class EmploymentType(str, Enum):
    r"""Employee employment type to filter by"""

    EXEMPT = "exempt"
    SALARIED_NONEXEMPT = "salaried_nonexempt"
    NONEXEMPT = "nonexempt"
    COMMISSION_ONLY_EXEMPT = "commission_only_exempt"
    COMMISSION_ONLY_NONEXEMPT = "commission_only_nonexempt"


class PostCompaniesCompanyUUIDReportsEmploymentStatus(str, Enum):
    r"""Employee employment status to filter by"""

    ACTIVE_FULL_TIME = "active_full_time"
    ACTIVE_PART_TIME = "active_part_time"
    ACTIVE_PART_TIME_ELIGIBLE = "active_part_time_eligible"
    ACTIVE_VARIABLE = "active_variable"
    ACTIVE_SEASONAL = "active_seasonal"
    ACTIVE = "active"
    DISMISSED = "dismissed"


class PostCompaniesCompanyUUIDReportsRequestBodyTypedDict(TypedDict):
    columns: List[Columns]
    r"""Columns to include in the report"""
    groupings: List[Groupings]
    r"""How to group the report"""
    file_type: FileType
    r"""The type of file to generate"""
    custom_name: NotRequired[str]
    r"""The title of the report"""
    with_totals: NotRequired[bool]
    r"""Whether to include subtotals and grand totals in the report"""
    start_date: NotRequired[date]
    r"""Start date of data to filter by"""
    end_date: NotRequired[date]
    r"""End date of data to filter by"""
    dismissed_start_date: NotRequired[date]
    r"""Dismissed start date of employees to filter by"""
    dismissed_end_date: NotRequired[date]
    r"""Dismissed end date of employees to filter by"""
    payment_method: NotRequired[PostCompaniesCompanyUUIDReportsPaymentMethod]
    r"""Payment method to filter by"""
    employment_type: NotRequired[EmploymentType]
    r"""Employee employment type to filter by"""
    employment_status: NotRequired[PostCompaniesCompanyUUIDReportsEmploymentStatus]
    r"""Employee employment status to filter by"""
    employee_uuids: NotRequired[List[str]]
    r"""Employees to filter by"""
    department_uuids: NotRequired[List[str]]
    r"""Departments to filter by"""
    work_address_uuids: NotRequired[List[str]]
    r"""Work addresses to filter by"""


class PostCompaniesCompanyUUIDReportsRequestBody(BaseModel):
    columns: List[Columns]
    r"""Columns to include in the report"""

    groupings: List[Groupings]
    r"""How to group the report"""

    file_type: FileType
    r"""The type of file to generate"""

    custom_name: Optional[str] = None
    r"""The title of the report"""

    with_totals: Optional[bool] = False
    r"""Whether to include subtotals and grand totals in the report"""

    start_date: Optional[date] = None
    r"""Start date of data to filter by"""

    end_date: Optional[date] = None
    r"""End date of data to filter by"""

    dismissed_start_date: Optional[date] = None
    r"""Dismissed start date of employees to filter by"""

    dismissed_end_date: Optional[date] = None
    r"""Dismissed end date of employees to filter by"""

    payment_method: Optional[PostCompaniesCompanyUUIDReportsPaymentMethod] = None
    r"""Payment method to filter by"""

    employment_type: Optional[EmploymentType] = None
    r"""Employee employment type to filter by"""

    employment_status: Optional[PostCompaniesCompanyUUIDReportsEmploymentStatus] = None
    r"""Employee employment status to filter by"""

    employee_uuids: Optional[List[str]] = None
    r"""Employees to filter by"""

    department_uuids: Optional[List[str]] = None
    r"""Departments to filter by"""

    work_address_uuids: Optional[List[str]] = None
    r"""Work addresses to filter by"""


class PostCompaniesCompanyUUIDReportsRequestTypedDict(TypedDict):
    company_uuid: str
    r"""The UUID of the company"""
    request_body: PostCompaniesCompanyUUIDReportsRequestBodyTypedDict
    x_gusto_api_version: NotRequired[VersionHeader]
    r"""Determines the date-based API version associated with your API call. If none is provided, your application's [minimum API version](https://docs.gusto.com/embedded-payroll/docs/api-versioning#minimum-api-version) is used."""


class PostCompaniesCompanyUUIDReportsRequest(BaseModel):
    company_uuid: Annotated[
        str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
    ]
    r"""The UUID of the company"""

    request_body: Annotated[
        PostCompaniesCompanyUUIDReportsRequestBody,
        FieldMetadata(request=RequestMetadata(media_type="application/json")),
    ]

    x_gusto_api_version: Annotated[
        Optional[VersionHeader],
        pydantic.Field(alias="X-Gusto-API-Version"),
        FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
    ] = VersionHeader.TWO_THOUSAND_AND_TWENTY_FOUR_04_01
    r"""Determines the date-based API version associated with your API call. If none is provided, your application's [minimum API version](https://docs.gusto.com/embedded-payroll/docs/api-versioning#minimum-api-version) is used."""
