"""
Payrix (Worldpay Payrix Pro) configuration helpers.

Env-driven configuration sourced from global application settings.
"""
from __future__ import annotations

import base64
from dataclasses import dataclass
from typing import Dict

from src.core.config import settings


@dataclass(frozen=True)
class PayrixConfig:
    base_url: str
    auth_header_name: str
    auth_header_value: str | None
    webhook_header_name: str | None
    webhook_header_value: str | None


def _compute_auth_header_value() -> str | None:
    # Explicit override wins
    override = settings.PAYRIX_AUTH_HEADER_VALUE.strip() if settings.PAYRIX_AUTH_HEADER_VALUE else ""
    if override:
        return override

    # Basic auth via API key + secret
    key = settings.PAYRIX_API_KEY.strip() if settings.PAYRIX_API_KEY else ""
    secret = settings.PAYRIX_API_SECRET.strip() if settings.PAYRIX_API_SECRET else ""
    if key and secret:
        b64 = base64.b64encode(f"{key}:{secret}".encode("utf-8")).decode("utf-8")
        return f"Basic {b64}"

    # Bearer token
    token = settings.PAYRIX_AUTH_TOKEN.strip() if settings.PAYRIX_AUTH_TOKEN else ""
    if token:
        return f"Bearer {token}"

    return None


def get_payrix_config() -> PayrixConfig:
    return PayrixConfig(
        base_url=settings.PAYRIX_BASE_URL.rstrip("/"),
        auth_header_name=settings.PAYRIX_AUTH_HEADER_NAME or "Authorization",
        auth_header_value=_compute_auth_header_value(),
        webhook_header_name=(settings.PAYRIX_WEBHOOK_HEADER_NAME or "X-Payrix-Webhook-Secret"),
        webhook_header_value=(settings.PAYRIX_WEBHOOK_HEADER_VALUE or None),
    )


def get_auth_headers() -> Dict[str, str]:
    cfg = get_payrix_config()
    headers: Dict[str, str] = {"Accept": "application/json", "Content-Type": "application/json"}

    # If API expects APIKEY header, use raw API key (no Basic/Bearer)
    if cfg.auth_header_name and cfg.auth_header_name.upper() == "APIKEY":
        api_key = (settings.PAYRIX_API_SECRET or "").strip()
        if api_key:
            headers["APIKEY"] = api_key
        return headers

    # Otherwise, use computed auth header (Basic/Bearer/override)
    if cfg.auth_header_value:
        headers[cfg.auth_header_name] = cfg.auth_header_value
    return headers
