# recharge/services/provider_factory.py
from __future__ import annotations
from typing import Protocol, Optional, Dict, Any
from django.conf import settings

# Import your existing clients
from recharge.services.goterpay_api import GoterPayAPI, GoterPayConfig
from recharge.services.a1topup_api import A1TopupAPI  # your existing file/class

class RechargeProvider(Protocol):
    # --- Common methods used by your flow ---
    def mobile_info(self, mobile: str) -> Dict[str, Any]: ...
    def recharge_plan(self, operator_code: str, circle_code: str) -> Dict[str, Any]: ...
    def r_offer(self, operator_code: str, number: str) -> Dict[str, Any]: ...
    def dth_info(self, operator_code: str, number: str) -> Dict[str, Any]: ...
    def mobile_recharge(self, *, txnid: str, number: str, amount: str|int|float,
                        operator_code: str, circle_code: str, subwallet: Optional[str]=None) -> Dict[str, Any]: ...
    def status(self, txnid: str) -> Dict[str, Any]: ...
    def bill_fetch(self, *, number: str, operator_code: str, txnid: str, optional1: Optional[str]=None) -> Dict[str, Any]: ...
    def bill_pay(self, *, txnid: str, number: str, amount: str|int|float,
                 operator_code: str, optional1: Optional[str]=None, subwallet: Optional[str]=None) -> Dict[str, Any]: ...
    def complaint(self, *, txnid: str, remark: str) -> Dict[str, Any]: ...

def get_recharge_client() -> RechargeProvider:
    provider_key = getattr(settings, "RECHARGE_PROVIDER", "goterpay").lower()
    cfg = settings.RECHARGE_PROVIDERS.get(provider_key, {})

    if provider_key == "goterpay":
        return GoterPayAPI(GoterPayConfig(
            mid=cfg["mid"], mkey=cfg["mkey"], subwallet=cfg.get("subwallet")
        ))

    if provider_key == "a1topup":
        # Construct from whatever your A1TopupAPI expects
        return A1TopupAPI(
            base_url=cfg.get("base_url"),
            api_key=cfg.get("api_key"),
            api_secret=cfg.get("api_secret"),
            # ... add/adjust as per your class
        )

    raise ValueError(f"Unknown RECHARGE_PROVIDER: {provider_key}")
