from typing import Annotated
from uuid import UUID

from fastapi import Depends, Header
from fastapi.security import APIKeyHeader
from src.const import CLIENT_API_KEY_HEADER, CLIENT_IDEMPOTENCY_KEY_HEADER, CLIENT_TENANT_NAME_HEADER

API_KEY_HEADER_DESCRIPTION = """
APIキーを指定するためのヘッダーです。クライアント環境（e.g. HCIの本番環境）につき一つのAPIキーを発行します。

※ テナントごとにAPIキーは発行されません。
"""  # noqa: RUF001


def get_api_key(
    api_key: str = Depends(
        APIKeyHeader(
            name=CLIENT_API_KEY_HEADER,
            auto_error=True,
            description=API_KEY_HEADER_DESCRIPTION,
        ),
    ),
) -> str:
    return api_key


TENANT_NAME_HEADER_DESCRIPTION = """
テナント名を指定するためのヘッダーです。

連携しているCTM2.0のテナント名を指定してください。（e.g. works）
"""  # noqa: RUF001


def get_client_tenant_name(
    client_tenant_name: Annotated[
        str,
        Header(
            ...,
            alias=CLIENT_TENANT_NAME_HEADER,
            description=TENANT_NAME_HEADER_DESCRIPTION,
        ),
    ],
) -> str:
    return client_tenant_name


IDEMPOTENCY_KEY_HEADER_DESCRIPTION = """
リクエストの冪等性を保証するために使用される一意のキーです。
同じリクエストを複数回送信しても、最初の1回と同じ結果になるようにします。クライアントでUUIDを生成して入力してください。
"""


def get_idempotency_key(
    idempotency_key: Annotated[
        UUID,
        Header(
            ...,
            alias=CLIENT_IDEMPOTENCY_KEY_HEADER,
            description=IDEMPOTENCY_KEY_HEADER_DESCRIPTION,
        ),
    ],
) -> UUID:
    return idempotency_key
