"""
Utilities to map Payrix transaction statuses/events into internal enums.

Used by both synchronous flows (charge submissions) and webhook handlers.
"""
from __future__ import annotations

from typing import Any, Dict, Optional

from src.core.utils.enums import TransactionStatusTypes


def _get_value(payload: Dict[str, Any], *keys: str) -> Optional[str]:
    for k in keys:
        v = payload.get(k)
        if isinstance(v, str):
            return v
    return None


def map_payrix_payload_to_transaction_status(payload: Dict[str, Any]) -> TransactionStatusTypes:
    """
    Map Payrix webhook/response payload to internal `TransactionStatusTypes`.

    Checks common event keys like `event`, `type`, `eventType` and status keys
    like `status`, `state`, `result`. Fallback is `PENDING`.
    """
    # Prefer explicit event types if provided
    event_type = _get_value(payload, "event", "type", "eventType")
    if event_type:
        e = event_type.lower()
        if "captured" in e:
            return TransactionStatusTypes.CAPTURED
        if "approved" in e or "paid" in e or "succeeded" in e or "success" in e:
            return TransactionStatusTypes.PAID
        if "declined" in e or "failed" in e or "error" in e:
            return TransactionStatusTypes.FAILED

    # Else rely on generic status fields
    status_value = _get_value(payload, "status", "state", "result")
    if status_value:
        s = status_value.lower()
        if s in {"captured"}:
            return TransactionStatusTypes.CAPTURED
        if s in {"approved", "paid", "succeeded", "success"}:
            return TransactionStatusTypes.PAID
        if s in {"declined", "failed", "error"}:
            return TransactionStatusTypes.FAILED

    return TransactionStatusTypes.PENDING


def transaction_status_enum_to_string(status: TransactionStatusTypes) -> str:
    """
    Convert internal enum to unified strings for client surfaces.

    - CAPTURED/PAID → "succeeded"
    - FAILED → "failed"
    - PENDING → "processing"
    """
    if status in (TransactionStatusTypes.CAPTURED, TransactionStatusTypes.PAID):
        return "succeeded"
    if status == TransactionStatusTypes.FAILED:
        return "failed"
    return "processing"
