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

from .basesdk import BaseSDK
from gusto_embedded import models, utils
from gusto_embedded._hooks import HookContext
from gusto_embedded.types import OptionalNullable, UNSET
from gusto_embedded.utils import get_security_from_env
from typing import Any, List, Mapping, Optional, Union


class JobCompensations(BaseSDK):
    def create(
        self,
        *,
        job_id: str,
        payment_unit: models.PostV1CompensationsCompensationIDPaymentUnit,
        flsa_status: models.FlsaStatusType,
        x_gusto_api_version: Optional[models.VersionHeader] = None,
        rate: Optional[str] = None,
        effective_date: Optional[str] = None,
        adjust_for_minimum_wage: Optional[bool] = None,
        minimum_wages: Optional[
            Union[
                List[models.PostV1CompensationsCompensationIDMinimumWages],
                List[models.PostV1CompensationsCompensationIDMinimumWagesTypedDict],
            ]
        ] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.Compensation:
        r"""Create a compensation

        Compensations contain information on how much is paid out for a job. Jobs may have many compensations, but only one that is active. The current compensation is the one with the most recent `effective_date`.

        scope: `jobs:write`

        :param job_id: The UUID of the job
        :param payment_unit: The unit accompanying the compensation rate. If the employee is an owner, rate should be 'Paycheck'.
        :param flsa_status: The FLSA status for this compensation. Salaried ('Exempt') employees are paid a fixed salary every pay period. Salaried with overtime ('Salaried Nonexempt') employees are paid a fixed salary every pay period, and receive overtime pay when applicable. Hourly ('Nonexempt') employees are paid for the hours they work, and receive overtime pay when applicable. Commissioned employees ('Commission Only Exempt') earn wages based only on commission. Commissioned with overtime ('Commission Only Nonexempt') earn wages based on commission, and receive overtime pay when applicable. Owners ('Owner') are employees that own at least twenty percent of the company.
        :param x_gusto_api_version: 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.
        :param rate: The dollar amount paid per payment unit.
        :param effective_date: The date when the compensation takes effect.
        :param adjust_for_minimum_wage: Determines whether the compensation should be adjusted for minimum wage. Only applies to Nonexempt employees.
        :param minimum_wages:
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url

        request = models.PostV1CompensationsCompensationIDRequest(
            job_id=job_id,
            x_gusto_api_version=x_gusto_api_version,
            request_body=models.PostV1CompensationsCompensationIDRequestBody(
                rate=rate,
                payment_unit=payment_unit,
                effective_date=effective_date,
                flsa_status=flsa_status,
                adjust_for_minimum_wage=adjust_for_minimum_wage,
                minimum_wages=utils.get_pydantic_model(
                    minimum_wages,
                    Optional[
                        List[models.PostV1CompensationsCompensationIDMinimumWages]
                    ],
                ),
            ),
        )

        req = self._build_request(
            method="POST",
            path="/v1/jobs/{job_id}/compensations",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=True,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request.request_body,
                False,
                False,
                "json",
                models.PostV1CompensationsCompensationIDRequestBody,
            ),
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = self.do_request(
            hook_ctx=HookContext(
                operation_id="post-v1-compensations-compensation_id",
                oauth2_scopes=[],
                security_source=get_security_from_env(
                    self.sdk_configuration.security, models.Security
                ),
            ),
            request=req,
            error_status_codes=["404", "422", "4XX", "5XX"],
            retry_config=retry_config,
        )

        response_data: Any = None
        if utils.match_response(http_res, "201", "application/json"):
            return utils.unmarshal_json(http_res.text, models.Compensation)
        if utils.match_response(http_res, "422", "application/json"):
            response_data = utils.unmarshal_json(
                http_res.text, models.UnprocessableEntityErrorObjectData
            )
            raise models.UnprocessableEntityErrorObject(data=response_data)
        if utils.match_response(http_res, ["404", "4XX"], "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )

        content_type = http_res.headers.get("Content-Type")
        http_res_text = utils.stream_to_text(http_res)
        raise models.APIError(
            f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
            http_res.status_code,
            http_res_text,
            http_res,
        )

    async def create_async(
        self,
        *,
        job_id: str,
        payment_unit: models.PostV1CompensationsCompensationIDPaymentUnit,
        flsa_status: models.FlsaStatusType,
        x_gusto_api_version: Optional[models.VersionHeader] = None,
        rate: Optional[str] = None,
        effective_date: Optional[str] = None,
        adjust_for_minimum_wage: Optional[bool] = None,
        minimum_wages: Optional[
            Union[
                List[models.PostV1CompensationsCompensationIDMinimumWages],
                List[models.PostV1CompensationsCompensationIDMinimumWagesTypedDict],
            ]
        ] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.Compensation:
        r"""Create a compensation

        Compensations contain information on how much is paid out for a job. Jobs may have many compensations, but only one that is active. The current compensation is the one with the most recent `effective_date`.

        scope: `jobs:write`

        :param job_id: The UUID of the job
        :param payment_unit: The unit accompanying the compensation rate. If the employee is an owner, rate should be 'Paycheck'.
        :param flsa_status: The FLSA status for this compensation. Salaried ('Exempt') employees are paid a fixed salary every pay period. Salaried with overtime ('Salaried Nonexempt') employees are paid a fixed salary every pay period, and receive overtime pay when applicable. Hourly ('Nonexempt') employees are paid for the hours they work, and receive overtime pay when applicable. Commissioned employees ('Commission Only Exempt') earn wages based only on commission. Commissioned with overtime ('Commission Only Nonexempt') earn wages based on commission, and receive overtime pay when applicable. Owners ('Owner') are employees that own at least twenty percent of the company.
        :param x_gusto_api_version: 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.
        :param rate: The dollar amount paid per payment unit.
        :param effective_date: The date when the compensation takes effect.
        :param adjust_for_minimum_wage: Determines whether the compensation should be adjusted for minimum wage. Only applies to Nonexempt employees.
        :param minimum_wages:
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url

        request = models.PostV1CompensationsCompensationIDRequest(
            job_id=job_id,
            x_gusto_api_version=x_gusto_api_version,
            request_body=models.PostV1CompensationsCompensationIDRequestBody(
                rate=rate,
                payment_unit=payment_unit,
                effective_date=effective_date,
                flsa_status=flsa_status,
                adjust_for_minimum_wage=adjust_for_minimum_wage,
                minimum_wages=utils.get_pydantic_model(
                    minimum_wages,
                    Optional[
                        List[models.PostV1CompensationsCompensationIDMinimumWages]
                    ],
                ),
            ),
        )

        req = self._build_request_async(
            method="POST",
            path="/v1/jobs/{job_id}/compensations",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=True,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request.request_body,
                False,
                False,
                "json",
                models.PostV1CompensationsCompensationIDRequestBody,
            ),
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = await self.do_request_async(
            hook_ctx=HookContext(
                operation_id="post-v1-compensations-compensation_id",
                oauth2_scopes=[],
                security_source=get_security_from_env(
                    self.sdk_configuration.security, models.Security
                ),
            ),
            request=req,
            error_status_codes=["404", "422", "4XX", "5XX"],
            retry_config=retry_config,
        )

        response_data: Any = None
        if utils.match_response(http_res, "201", "application/json"):
            return utils.unmarshal_json(http_res.text, models.Compensation)
        if utils.match_response(http_res, "422", "application/json"):
            response_data = utils.unmarshal_json(
                http_res.text, models.UnprocessableEntityErrorObjectData
            )
            raise models.UnprocessableEntityErrorObject(data=response_data)
        if utils.match_response(http_res, ["404", "4XX"], "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )

        content_type = http_res.headers.get("Content-Type")
        http_res_text = await utils.stream_to_text_async(http_res)
        raise models.APIError(
            f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
            http_res.status_code,
            http_res_text,
            http_res,
        )
