import logging
import requests
from django.conf import settings

logger = logging.getLogger(__name__)

MEGAPAY_INITIATE_URL = "https://megapay.co.ke/backend/v1/initiatestk"
MEGAPAY_STATUS_URL = "https://megapay.co.ke/backend/v1/transactionstatus"


def _credentials():
    api_key = getattr(settings, "MEGAPAY_API_KEY", "")
    email = getattr(settings, "MEGAPAY_EMAIL", "")
    if not api_key or not email:
        raise RuntimeError("MegaPay credentials are not configured")
    return api_key, email


def initiate_megapay_payment(reference, phone_number, amount):
    api_key, email = _credentials()
    payload = {
        "api_key": api_key,
        "email": email,
        "amount": str(amount),
        "msisdn": phone_number,
        "reference": reference,
    }
    response = requests.post(
        MEGAPAY_INITIATE_URL,
        json=payload,
        headers={"Content-Type": "application/json"},
        timeout=30,
    )
    try:
        data = response.json()
    except ValueError:
        data = {"message": response.text[:300]}
    data["_http_status"] = response.status_code
    return data


def get_megapay_transaction_status(transaction_request_id):
    api_key, email = _credentials()
    response = requests.post(
        MEGAPAY_STATUS_URL,
        json={
            "api_key": api_key,
            "email": email,
            "transaction_request_id": transaction_request_id,
        },
        headers={"Content-Type": "application/json"},
        timeout=30,
    )
    response.raise_for_status()
    return response.json()


def parse_megapay_webhook(data):
    response_code = data.get("ResponseCode")
    try:
        successful = int(response_code) == 0
    except (TypeError, ValueError):
        successful = False
    return {
        "successful": successful,
        "reference": data.get("TransactionReference"),
        "request_id": data.get("TransactionID") or data.get("CheckoutRequestID"),
        "receipt": data.get("TransactionReceipt"),
        "amount": data.get("TransactionAmount"),
        "phone": data.get("Msisdn"),
        "description": data.get("ResponseDescription", ""),
    }
