# accounts\dispatcher.py
from accounts.utils import perform_wallet_recharge, perform_bill_payment
from utilities.views import _perform_goter_bill_payment
from typing import Any, Dict, Optional, Tuple
from recharge.services.goterpay_client import get_goterpay_client
from recharge.services.goterpay_api import GoterPayAPI

# def _map_fields(service: str, fields: Dict[str, Any]) -> Tuple[str, Optional[str]]:
#     s = (service or "").lower()

#     # FASTag
#     if s == "fastag":
#         return fields.get("vehicle_number", ""), None

#     # LPG/GAS (toggle based on your "book_using" UI)
#     if s in ("lpg", "gas"):
#         using = (fields.get("book_using") or "").lower()
#         if using == "consumer id":
#             return fields.get("consumer_id", ""), fields.get("mobile")
#         # default: Mobile Number
#         return fields.get("mobile", ""), fields.get("consumer_id")

#     # Electricity / Postpaid / others — pick the primary identifier you used for fetch
#     for key in ("consumer_number","account_no","ca_number","mobile","number","connection_id","account_id"):
#         if fields.get(key):
#             return str(fields[key]), None

#     return "", None

# from voucher.utils import perform_voucher_purchase

# def dispatch_service_payment(
#     service, user, metadata, amount, order_id, client_txn_id,
#     use_ext, use_int, gateway_ref
# ):
#     if service == "prepaid":
#         return perform_wallet_recharge(
#             user=user,
#             number=metadata.get("mobile"),
#             operator=metadata.get("operator"),
#             circle=metadata.get("circle"),
#             amount=amount,
#             order_id=order_id,
#             client_txn_id=client_txn_id,
#             use_ext=use_ext,
#             use_int=use_int,
#             gateway_ref=gateway_ref
#         )

#     elif service in ("postpaid","fastag","electricity","landline","broadband","gas","insurance","loan","water","dth"):
#         # Create your RechargeTransaction row here if your status poll expects it:
#         # RechargeTransaction.objects.create(
#         #     user=user, order_id=order_id, client_txn_id=client_txn_id, amount=amount,
#         #     operator=metadata.get("provider",""), status="pending", status_message="Initiated",
#         #     response_data={"request": metadata}
#         # )
#         # result = _perform_goter_bill_payment(
#         #     service=service,
#         #     provider=metadata.get("provider") or metadata.get("operator") or "",
#         #     fields=metadata.get("fields") or metadata,   # your app sends fields under 'fields'
#         #     amount=int(amount),
#         #     client_txn_id=client_txn_id
#         # )
#         # return {
#         #     "status": result["status"],
#         #     "provider_ref": result.get("provider_ref")  # ✅ normalized (TxnId/ref/RefId/reference)
#         # }
#         return perform_bill_payment(
#             user=user,
#             service=service,
#             provider=metadata.get("provider") or metadata.get("operator") or "",
#             fields=(metadata.get("fields") or metadata),
#             amount=int(amount),
#             order_id=order_id,
#             client_txn_id=client_txn_id,
#             use_ext=use_ext,
#             use_int=use_int,
#             gateway_ref=gateway_ref,
#         )

#     elif service == "voucher":
#         # return perform_voucher_purchase(...)  # your future flow
#         pass

#     else:
#         raise ValueError(f"Unsupported service type: {service}")



# ================================================================================

# accounts/dispatcher.py
from typing import Any, Dict, Optional, Tuple
from decimal import Decimal, InvalidOperation, ROUND_HALF_UP

from accounts.utils import perform_wallet_recharge, perform_bill_payment
from utilities.views import _perform_goter_bill_payment
from recharge.services.goterpay_client import get_goterpay_client
from recharge.services.goterpay_api import GoterPayAPI
import logging

TWOPL = Decimal("0.01")
def _d(x):
    try: return Decimal(str(x))
    except (InvalidOperation, ValueError, TypeError): return Decimal("0")
def q2(x: Decimal) -> Decimal: return _d(x).quantize(TWOPL, rounding=ROUND_HALF_UP)
def to_paise(x: Decimal) -> int: return int((q2(x) * 100).quantize(Decimal("1"), rounding=ROUND_HALF_UP))

def dispatch_service_payment(
    service,
    user,
    metadata: Dict[str, Any],
    amount=None,                          # ← defaulted (legacy callers can omit)
    order_id: Optional[str]=None,
    client_txn_id: Optional[str]=None,
    use_ext=0,                            # ← defaulted
    use_int=0,                            # ← defaulted
    gateway_ref: Optional[str]=None,
    razorpay_order_id: Optional[str]=None,
    razorpay_payment_id: Optional[str]=None,
    **kwargs                      # <- accept future fields safely

):
    log = logging.getLogger(__name__)
    # Normalize service
    service = (service or "").lower()
    # Optional new fields from callers
    amt_rupees_kw = kwargs.get("amount_rupees")   # str/Decimal
    amt_paise_kw  = kwargs.get("amount_paise")    # int
    log.info(service)
    # Normalize amounts
    amount_rupees = q2(_d(amt_rupees_kw if amt_rupees_kw is not None else amount))
    amount_paise  = amt_paise_kw if amt_paise_kw is not None else to_paise(amount_rupees)
    use_ext_r     = q2(_d(use_ext))
    use_int_r     = q2(_d(use_int))
    log.info(" In side dispatch_service_payment function")
    # log.info(metadata)
    # Optional Razorpay IDs from kwargs if provided there
    razorpay_order_id   = kwargs.get("razorpay_order_id", razorpay_order_id)
    razorpay_payment_id = kwargs.get("razorpay_payment_id", razorpay_payment_id)
    log.info(" getting into [perform_wallet_recharge / perform_bill_payment] based on service")
    if service == "prepaid":
        log.info(" Sending to prepaid perform wallet recharge")
        return perform_wallet_recharge(
            user=user,
            number=metadata.get("mobile"),
            operator=metadata.get("operator"),
            circle=metadata.get("circle"),
            # preferred/new
            amount_rupees=str(amount_rupees),
            amount_paise=amount_paise,
            # legacy (kept for backward compatibility)
            amount=str(amount_rupees),             # legacy

            order_id=order_id,
            client_txn_id=client_txn_id,
            use_ext=str(use_ext_r),
            use_int=str(use_int_r),
            gateway_ref=gateway_ref,
            razorpay_order_id=razorpay_order_id,
            razorpay_payment_id=razorpay_payment_id,
        )

    elif service in ("postpaid","fastag","electricity","landline","broadband","gas","lpg","insurance","loan","water","dth"):
        fields = (metadata.get("fields") or metadata)

        # log.info("__%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Enter Erform Bill Payment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%__")
        # log.info(service)
        # log.info(metadata.get("provider"))
        # log.info(fields)
        return perform_bill_payment(
            user=user,
            service=service,
            provider=metadata.get("provider") or metadata.get("operator") or "",
            fields=fields,
            # preferred/new
            amount_rupees=str(amount_rupees),
            amount_paise=amount_paise,
            # legacy
            amount=str(amount_rupees),             # legacy

            order_id=order_id,
            client_txn_id=client_txn_id,
            use_ext=str(use_ext_r),
            use_int=str(use_int_r),
            gateway_ref=gateway_ref,
            razorpay_order_id=razorpay_order_id,
            razorpay_payment_id=razorpay_payment_id,
        )

    elif service == "voucher":
        raise ValueError("Voucher flow not implemented yet.")
    else:
        raise ValueError(f"Unsupported service type: {service}")

