from http import HTTPStatus
from typing import Any

import httpx

from ... import errors
from ...client import AuthenticatedClient, Client
from ...models.pkg_routes_webhooks_g_mail_webhook_request import PkgRoutesWebhooksGMailWebhookRequest
from ...models.pkg_routes_webhooks_g_mail_webhook_response import PkgRoutesWebhooksGMailWebhookResponse
from ...models.post_webhooks_gmail_response_400 import PostWebhooksGmailResponse400
from ...models.post_webhooks_gmail_response_403 import PostWebhooksGmailResponse403
from ...models.post_webhooks_gmail_response_500 import PostWebhooksGmailResponse500
from ...types import Response


def _get_kwargs(
    *,
    body: PkgRoutesWebhooksGMailWebhookRequest,
) -> dict[str, Any]:
    headers: dict[str, Any] = {}

    _kwargs: dict[str, Any] = {
        "method": "post",
        "url": "/webhooks/gmail",
    }

    _kwargs["json"] = body.to_dict()

    headers["Content-Type"] = "application/json"

    _kwargs["headers"] = headers
    return _kwargs


def _parse_response(
    *, client: AuthenticatedClient | Client, response: httpx.Response
) -> (
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
    | None
):
    if response.status_code == 200:
        response_200 = PkgRoutesWebhooksGMailWebhookResponse.from_dict(response.json())

        return response_200

    if response.status_code == 400:
        response_400 = PostWebhooksGmailResponse400.from_dict(response.json())

        return response_400

    if response.status_code == 403:
        response_403 = PostWebhooksGmailResponse403.from_dict(response.json())

        return response_403

    if response.status_code == 500:
        response_500 = PostWebhooksGmailResponse500.from_dict(response.json())

        return response_500

    if client.raise_on_unexpected_status:
        raise errors.UnexpectedStatus(response.status_code, response.content)
    else:
        return None


def _build_response(
    *, client: AuthenticatedClient | Client, response: httpx.Response
) -> Response[
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
]:
    return Response(
        status_code=HTTPStatus(response.status_code),
        content=response.content,
        headers=response.headers,
        parsed=_parse_response(client=client, response=response),
    )


def sync_detailed(
    *,
    client: AuthenticatedClient | Client,
    body: PkgRoutesWebhooksGMailWebhookRequest,
) -> Response[
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
]:
    """Gmail webhook handler

     Handles webhook events from Gmail API push notifications. Validates subscription ID and decodes
    message data to extract email address and history ID. Processes email sync in background. Returns
    200 immediately to acknowledge receipt.

    Args:
        body (PkgRoutesWebhooksGMailWebhookRequest):

    Raises:
        errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
        httpx.TimeoutException: If the request takes longer than Client.timeout.

    Returns:
        Response[PkgRoutesWebhooksGMailWebhookResponse | PostWebhooksGmailResponse400 | PostWebhooksGmailResponse403 | PostWebhooksGmailResponse500]
    """

    kwargs = _get_kwargs(
        body=body,
    )

    response = client.get_httpx_client().request(
        **kwargs,
    )

    return _build_response(client=client, response=response)


def sync(
    *,
    client: AuthenticatedClient | Client,
    body: PkgRoutesWebhooksGMailWebhookRequest,
) -> (
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
    | None
):
    """Gmail webhook handler

     Handles webhook events from Gmail API push notifications. Validates subscription ID and decodes
    message data to extract email address and history ID. Processes email sync in background. Returns
    200 immediately to acknowledge receipt.

    Args:
        body (PkgRoutesWebhooksGMailWebhookRequest):

    Raises:
        errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
        httpx.TimeoutException: If the request takes longer than Client.timeout.

    Returns:
        PkgRoutesWebhooksGMailWebhookResponse | PostWebhooksGmailResponse400 | PostWebhooksGmailResponse403 | PostWebhooksGmailResponse500
    """

    return sync_detailed(
        client=client,
        body=body,
    ).parsed


async def asyncio_detailed(
    *,
    client: AuthenticatedClient | Client,
    body: PkgRoutesWebhooksGMailWebhookRequest,
) -> Response[
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
]:
    """Gmail webhook handler

     Handles webhook events from Gmail API push notifications. Validates subscription ID and decodes
    message data to extract email address and history ID. Processes email sync in background. Returns
    200 immediately to acknowledge receipt.

    Args:
        body (PkgRoutesWebhooksGMailWebhookRequest):

    Raises:
        errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
        httpx.TimeoutException: If the request takes longer than Client.timeout.

    Returns:
        Response[PkgRoutesWebhooksGMailWebhookResponse | PostWebhooksGmailResponse400 | PostWebhooksGmailResponse403 | PostWebhooksGmailResponse500]
    """

    kwargs = _get_kwargs(
        body=body,
    )

    response = await client.get_async_httpx_client().request(**kwargs)

    return _build_response(client=client, response=response)


async def asyncio(
    *,
    client: AuthenticatedClient | Client,
    body: PkgRoutesWebhooksGMailWebhookRequest,
) -> (
    PkgRoutesWebhooksGMailWebhookResponse
    | PostWebhooksGmailResponse400
    | PostWebhooksGmailResponse403
    | PostWebhooksGmailResponse500
    | None
):
    """Gmail webhook handler

     Handles webhook events from Gmail API push notifications. Validates subscription ID and decodes
    message data to extract email address and history ID. Processes email sync in background. Returns
    200 immediately to acknowledge receipt.

    Args:
        body (PkgRoutesWebhooksGMailWebhookRequest):

    Raises:
        errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
        httpx.TimeoutException: If the request takes longer than Client.timeout.

    Returns:
        PkgRoutesWebhooksGMailWebhookResponse | PostWebhooksGmailResponse400 | PostWebhooksGmailResponse403 | PostWebhooksGmailResponse500
    """

    return (
        await asyncio_detailed(
            client=client,
            body=body,
        )
    ).parsed
