"""
Manu Topup Engine for SL CAT TOPUP Web Store
Integrates order fulfillment, UID verification, and status tracking with manutopup.com.
"""

import json
import logging
import urllib.parse
from typing import Dict, Any, Optional, List
import requests

logger = logging.getLogger("manu_engine")

MANU_BASE_URL = "https://manutopup.com"
DEVELOPER_UID = "y89OQSRlHZVUjSe9J1YDUAFDDqW2"
API_KEY = "qflKcybqr7tc2fWya4EtT2zLYnTtvs"
MANU_ADMIN_WHATSAPP = "94729351052"

DEFAULT_HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Content-Type": "application/json",
    "Origin": MANU_BASE_URL,
    "Referer": f"{MANU_BASE_URL}/rr.html"
}

# Manu Topup Packages and Mapping from internal product IDs
MANU_PACKAGES_MAP: Dict[str, Dict[str, Any]] = {
    # Memberships
    "1": {"name": "Weekly Membership", "price": 569.0, "category": "Memberships"},
    "2": {"name": "Monthly Membership", "price": 2829.0, "category": "Memberships"},
    "3": {"name": "Weekly Lite Membership", "price": 136.0, "category": "Memberships"},
    # Level Up Passes
    "86": {"name": "Level Up Pass-06", "price": 130.0, "category": "Level Up Pass"},
    "87": {"name": "Level Up Pass-10", "price": 260.0, "category": "Level Up Pass"},
    "88": {"name": "Level Up Pass-15", "price": 260.0, "category": "Level Up Pass"},
    "89": {"name": "Level Up Pass-20", "price": 260.0, "category": "Level Up Pass"},
    "90": {"name": "Level Up Pass-25", "price": 260.0, "category": "Level Up Pass"},
    "91": {"name": "Level Up Pass-30", "price": 370.0, "category": "Level Up Pass"},
    # Diamonds
    "6": {"name": "25 Diamonds", "price": 96.0, "category": "Diamonds"},
    "7": {"name": "100 Diamonds", "price": 341.0, "category": "Diamonds"},
    "8": {"name": "310 Diamonds", "price": 998.0, "category": "Diamonds"},
    "9": {"name": "520 Diamonds", "price": 1697.0, "category": "Diamonds"},
    "10": {"name": "1060 Diamonds", "price": 3286.0, "category": "Diamonds"},
    "11": {"name": "2180 Diamonds", "price": 6599.0, "category": "Diamonds"},
    "12": {"name": "5600 Diamonds", "price": 16484.0, "category": "Diamonds"},
    "13": {"name": "11500 Diamonds", "price": 33698.0, "category": "Diamonds"},
}


def verify_player_uid_manu(uid: str, region: str = "SG") -> Dict[str, Any]:
    """
    Verifies Free Fire Player UID using Manu Topup's validation API.
    """
    clean_uid = "".join(c for c in str(uid).strip() if c.isdigit())
    if len(clean_uid) < 5:
        return {"valid": False, "message": "UID must be at least 5 digits"}

    url = "https://proapis.hlgamingofficial.com/main/games/freefire/validation/api"
    params = {
        "sectionName": "freefireValidation",
        "useruid": DEVELOPER_UID,
        "api": API_KEY,
        "uid": clean_uid,
        "region": region,
    }

    try:
        resp = requests.get(url, params=params, headers={"User-Agent": DEFAULT_HEADERS["User-Agent"]}, timeout=8)
        if resp.status_code == 200:
            data = resp.json()
            if data and data.get("result", {}).get("valid") is True:
                res = data.get("result", {})
                return {
                    "valid": True,
                    "nickname": res.get("AccountName") or "Player",
                    "level": res.get("AccountLevel") or "",
                    "uid": clean_uid,
                    "region": region,
                }
    except Exception as e:
        logger.warning(f"Manu UID verification error: {e}")

    return {"valid": False, "message": "Player UID not found on Manu Topup verification API"}


def create_manu_order(
    player_id: str,
    product_id: str,
    quantity: int = 1,
    customer_phone: str = "0771234567",
    customer_email: str = "slcatreseller@gmail.com",
    customer_name: str = "SL CAT Store",
    account_name: str = "",
    account_level: str = "",
    payment_method: str = "card",  # 'card' or 'wmx'
    firebase_uid: Optional[str] = None,
) -> Dict[str, Any]:
    """
    Creates an automated order on manutopup.com.
    Supports:
      - 'card': Direct order via create_order.php (returns orderId + GenieBiz paymentUrl)
      - 'wmx': WMX wallet coin order via create_order_wmx.php (instant deduction and execution)
    """
    pkg = MANU_PACKAGES_MAP.get(str(product_id).strip())
    if not pkg:
        # Check by name matching if product_id is already a name
        for k, v in MANU_PACKAGES_MAP.items():
            if v["name"].lower() == str(product_id).strip().lower():
                pkg = v
                break

    if not pkg:
        return {"success": False, "message": f"Unsupported Manu Topup product: {product_id}"}

    qty = max(1, int(quantity))
    price = float(pkg["price"])
    subtotal = price * qty

    items = [{"name": pkg["name"], "price": price, "qty": qty}]

    # If nickname is not provided, try quick verification
    if not account_name:
        check = verify_player_uid_manu(player_id)
        if check.get("valid"):
            account_name = check.get("nickname", "Player")
            account_level = check.get("level", "")

    if payment_method == "wmx":
        endpoint = f"{MANU_BASE_URL}/create_order_wmx.php"
        wmx_cost = int(subtotal / 10)  # 1 WMX = 10 LKR
        payload = {
            "ffId": str(player_id).strip(),
            "region": "SG",
            "whatsapp": str(customer_phone).strip() or "0771234567",
            "accountName": account_name,
            "accountLevel": account_level,
            "items": items,
            "lkrTotal": subtotal,
            "wmxCost": wmx_cost,
            "customerEmail": customer_email,
            "customerName": customer_name,
            "promoCode": "",
            "promoDiscount": 0,
            "firebaseUid": firebase_uid or "slcat_bot_wallet_uid",
        }
    else:
        endpoint = f"{MANU_BASE_URL}/create_order.php"
        tax_amount = round(subtotal * 0.02)
        total_amount = subtotal + tax_amount
        if tax_amount > 0:
            items_with_tax = items + [{"name": "Card Processing Fee (2%)", "price": tax_amount, "qty": 1}]
        else:
            items_with_tax = items

        payload = {
            "ffId": str(player_id).strip(),
            "region": "SG",
            "whatsapp": str(customer_phone).strip() or "0771234567",
            "accountName": account_name,
            "accountLevel": account_level,
            "items": items_with_tax,
            "customerEmail": customer_email,
            "customerName": customer_name,
            "promoCode": "",
            "promoDiscount": 0,
            "discountAmount": 0,
            "totalAmount": total_amount,
        }

    try:
        resp = requests.post(endpoint, json=payload, headers=DEFAULT_HEADERS, timeout=12)
        if resp.status_code == 200:
            data = resp.json()
            order_id = data.get("orderId")
            payment_url = data.get("paymentUrl") or data.get("redirect")

            wa_link = generate_manu_whatsapp_link(
                player_uid=player_id,
                package_name=pkg["name"],
                amount=subtotal,
                order_id=order_id,
            )

            return {
                "success": True,
                "provider": "manutopup.com",
                "order_id": order_id,
                "payment_url": payment_url,
                "transaction_id": data.get("transactionId"),
                "total_amount": subtotal,
                "package_name": pkg["name"],
                "player_id": player_id,
                "whatsapp_share_link": wa_link,
                "raw_response": data,
            }
        else:
            return {
                "success": False,
                "message": f"Manu Topup API error ({resp.status_code}): {resp.text}",
            }
    except Exception as e:
        logger.error(f"Manu Topup order error: {e}")
        return {"success": False, "message": f"Network error connecting to manutopup.com: {e}"}


def check_manu_order_status(order_id: Any) -> Dict[str, Any]:
    """
    Checks real-time fulfillment status of an order on manutopup.com.
    Endpoint: GET https://manutopup.com/check_status.php?orderId=<order_id>
    """
    clean_id = str(order_id).strip().replace("#FF-", "").replace("#", "")
    url = f"{MANU_BASE_URL}/check_status.php"

    try:
        resp = requests.get(
            url,
            params={"orderId": clean_id},
            headers={"User-Agent": DEFAULT_HEADERS["User-Agent"]},
            timeout=8,
        )
        if resp.status_code == 200:
            data = resp.json()
            return {
                "success": True,
                "order_id": data.get("orderId"),
                "status": data.get("status"),  # 'pending', 'completed', 'paid', 'failed'
                "player_id": data.get("ffId"),
                "account_name": data.get("accountName"),
                "total_amount": data.get("totalAmount"),
                "items": data.get("items", []),
                "raw": data,
            }
        else:
            return {"success": False, "message": f"Status check error ({resp.status_code}): {resp.text}"}
    except Exception as e:
        return {"success": False, "message": f"Connection error checking status: {e}"}


def get_manu_orders_by_email(email: str = "slcatreseller@gmail.com") -> Dict[str, Any]:
    """
    Fetches all orders associated with an email on manutopup.com.
    """
    url = f"{MANU_BASE_URL}/get_orders.php"
    try:
        resp = requests.get(
            url,
            params={"email": email.strip()},
            headers={"User-Agent": DEFAULT_HEADERS["User-Agent"]},
            timeout=8,
        )
        if resp.status_code == 200:
            return resp.json()
        return {"orders": [], "error": f"HTTP {resp.status_code}"}
    except Exception as e:
        return {"orders": [], "error": str(e)}


def generate_manu_whatsapp_link(
    player_uid: str,
    package_name: str,
    amount: float,
    order_id: Optional[Any] = None,
) -> str:
    """
    Generates direct 1-click WhatsApp order link for Manu Topup Admin (+94 72 935 1052).
    """
    msg = (
        f"New Top-Up Order (via SL CAT):\n"
        f"Order ID: #{order_id or 'MANU'}\n"
        f"Free Fire UID: {player_uid}\n"
        f"Package: {package_name}\n"
        f"Amount: LKR {amount:.2f}\n"
        f"Please deliver to player account as soon as possible."
    )
    encoded = urllib.parse.quote(msg)
    return f"https://wa.me/{MANU_ADMIN_WHATSAPP}?text={encoded}"
