"""
Local/sandbox payout provider. Simulates success/failure deterministically
based on PAYOUT_STUB_OUTCOME so the full reserve→settle/reverse pipeline can be
exercised end-to-end without a live gateway.
"""
from __future__ import annotations

import hashlib
from decimal import Decimal

from django.conf import settings

from .base import PayoutProvider, PayoutResult


class StubProvider(PayoutProvider):
    name = 'stub'

    def initiate(self, *, idempotency_key: str, amount: Decimal,
                 msisdn: str, account_name: str, provider: str) -> PayoutResult:
        outcome = getattr(settings, 'PAYOUT_STUB_OUTCOME', 'success')
        reference = 'STUB-' + hashlib.sha1(idempotency_key.encode()).hexdigest()[:12].upper()

        if outcome == 'fail':
            return PayoutResult(success=False, reference=reference,
                                message='Simulated provider failure')
        if outcome == 'random':
            # Deterministic per key so retries are stable.
            digit = int(hashlib.sha1(idempotency_key.encode()).hexdigest(), 16) % 10
            if digit < 2:  # ~20% failure
                return PayoutResult(success=False, reference=reference,
                                    message='Simulated random failure')
        return PayoutResult(success=True, reference=reference,
                            message='Simulated disbursement successful')


def get_provider(name: str | None = None) -> PayoutProvider:
    """Factory — returns the configured payout provider implementation."""
    name = (name or getattr(settings, 'PAYOUT_PROVIDER', 'stub')).lower()
    # Real adapters (mpesa/tigo/airtel) register here once credentials exist.
    return StubProvider()
