from __future__ import annotations

import os
from typing import Any, Dict, Optional

import requests


DEFAULT_PLYTIX_AUTH_URL = "https://auth.plytix.com/auth/api/get-token"


def fetch_plytix_api_token(
    api_key: str,
    api_password: str,
    *,
    auth_url: Optional[str] = None,
    timeout_s: int = 60,
) -> str:
    """Exchange Plytix API key + password for a short-lived bearer token."""
    api_key = str(api_key or "").strip()
    api_password = str(api_password or "").strip()
    if not api_key or not api_password:
        raise ValueError("PLYTIX_API_KEY and PLYTIX_API_PASSWORD are required for token auth")

    url = (auth_url or os.getenv("PLYTIX_AUTH_URL", DEFAULT_PLYTIX_AUTH_URL)).strip()
    response = requests.post(
        url,
        json={"api_key": api_key, "api_password": api_password},
        headers={"Accept": "application/json", "Content-Type": "application/json"},
        timeout=timeout_s,
    )
    response.raise_for_status()
    payload = response.json()
    token = _extract_token(payload)
    if not token:
        raise ValueError("Plytix auth response did not include an access token")
    return token


def _extract_token(payload: Any) -> Optional[str]:
    if isinstance(payload, str) and payload.strip():
        return payload.strip()
    if not isinstance(payload, dict):
        return None
    for key in ("access_token", "token", "api_token"):
        value = payload.get(key)
        if value:
            return str(value).strip()
    data = payload.get("data")
    if isinstance(data, dict):
        for key in ("access_token", "token", "api_token"):
            value = data.get(key)
            if value:
                return str(value).strip()
    if isinstance(data, list):
        for item in data:
            if not isinstance(item, dict):
                continue
            for key in ("access_token", "token", "api_token"):
                value = item.get(key)
                if value:
                    return str(value).strip()
    return None
