"""
JK 活动配置查询工具（复用 WePlay 配置中心接口）。

通过配置中心测试服（config-admin-dev-api）的 config/get_key 接口，
查询指定活动的完整配置信息（奖池、任务、筹码、组队等）。

数据可靠性说明：
- 活动上线后：配置信息与线上完全一致，可作为分析依据
- 活动上线前：可能包含临时/测试配置，不代表最终上线版本

使用示例：
    # 交互模式（按提示输入参数）
    python get_key_api.py

    # 在代码中调用
    from get_key_api import get_key
    response = get_key(key="6193", region="O", namespace="activity")
"""
import json
import logging
from typing import Optional

import requests  # pyright: ignore[reportMissingModuleSource]

# ==================== 配置常量 ====================
DEFAULT_REGION = "O"
DEFAULT_TIMEOUT_SECONDS = 10

GET_KEY_URL = "https://config-admin-dev-api.weplayapp.com/config/get_key"
GET_KEYS_BY_NAMESPACE_URL = "https://config-admin-dev-api.weplayapp.com/config/get_keys_by_namespace"
HEADERS = {"Content-Type": "application/x-www-form-urlencoded"}

logger = logging.getLogger(__name__)


# ==================== 对外接口 ====================
def get_key(key: str, region: str = DEFAULT_REGION, namespace: str = "activity", verbose: bool = True) -> Optional[requests.Response]:
    """
    查询配置中心的 key 值。

    Args:
        key: 配置 key（通常是活动 ID）
        region: 区服代号（如 "C", "A", "J" 等）
        namespace: 命名空间（默认 "activity"）
        verbose: 是否打印详细日志

    Returns:
        Response 对象，包含配置 JSON

    示例返回数据结构:
        {
            "code": 200,
            "result": {
                "value": '{"配置内容JSON字符串"}'
            }
        }
    """
    payload = {
        "key": key,
        "region": region,
        "namespace": namespace,
    }

    try:
        response = requests.post(GET_KEY_URL, data=payload, headers=HEADERS, timeout=DEFAULT_TIMEOUT_SECONDS)
        response.raise_for_status()

        if verbose:
            print(f"========== get_key 请求 ==========")
            print(f"URL: {GET_KEY_URL}")
            print(f"Payload: {payload}")
            print(f"\n========== 响应 ==========")
            print(f"Status Code: {response.status_code}")
            try:
                data = response.json()
                print(f"Response JSON:")
                print(json.dumps(data, indent=2, ensure_ascii=False))
            except:
                print(f"Response Text: {response.text}")

        return response

    except requests.exceptions.Timeout:
        logger.error("Request timeout: url=%s timeout=%ss payload=%s", GET_KEY_URL, DEFAULT_TIMEOUT_SECONDS, payload)
        return None
    except requests.exceptions.RequestException as e:
        status_code = e.response.status_code if e.response else None
        response_text = e.response.text if e.response else ""
        logger.error(
            "Request failed: url=%s status=%s payload=%s error=%s response=%s",
            GET_KEY_URL,
            status_code,
            payload,
            e,
            response_text,
        )
        return None


# ==================== 礼包查询接口 ====================
def get_gift_pkgs(act_id: str, region: str = DEFAULT_REGION, pkg_type: int = 3, verbose: bool = True) -> list:
    """
    查询指定活动的连锁礼包配置列表。

    Args:
        act_id: 活动 ID
        region: 区服代号（如 "C", "A", "O" 等）
        pkg_type: 礼包类型，默认 3（连锁礼包）
        verbose: 是否打印结果表格

    Returns:
        礼包列表，每条含 pkg_id、goods_id、description（礼包名称）、price，按 pkg_id 升序排列

    示例:
        pkgs = get_gift_pkgs("6897", "A")
        # [{"pkg_id": 860, "goods_id": 80, "description": "S1第一赛段1号礼包", "price": 12}, ...]
    """
    payload = {
        "namespace": "gift_pkg",
        "region": region,
        "page_size": 200,
        "page_num": 1,
        "select": json.dumps({"int_map": {"pkg_type": pkg_type, "act_id": int(act_id)}}),
        "sort_info": "{}",
    }

    try:
        response = requests.post(GET_KEYS_BY_NAMESPACE_URL, data=payload, headers=HEADERS, timeout=DEFAULT_TIMEOUT_SECONDS)
        response.raise_for_status()
        data = response.json()

        if data.get("code") != 200 or not data.get("result"):
            logger.error("get_gift_pkgs failed: code=%s msg=%s", data.get("code"), data.get("msg"))
            return []

        pkgs = []
        for item in data["result"].get("keys", []):
            try:
                val = json.loads(item["value"])
                pkgs.append({
                    "pkg_id": val["pkg_id"],
                    "goods_id": val["goods_id"],
                    "description": val.get("description", ""),
                    "price": val.get("price", ""),
                })
            except Exception:
                continue

        pkgs.sort(key=lambda x: x["pkg_id"])

        if verbose:
            print(f"========== 礼包查询结果 act_id={act_id} region={region} ==========")
            print(f"共 {len(pkgs)} 个礼包\n")
            print(f"{'pkg_id':<10} {'goods_id':<12} {'price':<10} 名称(description)")
            print("-" * 65)
            for p in pkgs:
                print(f"{p['pkg_id']:<10} {p['goods_id']:<12} {p['price']:<10} {p['description']}")

        return pkgs

    except requests.exceptions.Timeout:
        logger.error("Request timeout: url=%s payload=%s", GET_KEYS_BY_NAMESPACE_URL, payload)
        return []
    except requests.exceptions.RequestException as e:
        logger.error("Request failed: url=%s error=%s", GET_KEYS_BY_NAMESPACE_URL, e)
        return []


# ==================== CLI 入口 ====================
def main():
    """命令行交互入口。"""
    logging.basicConfig(level=logging.INFO, format="%(message)s")

    print("=" * 60)
    print("配置查询接口（get_key）工具")
    print("=" * 60)

    # 获取参数
    key = input("\n请输入 key (默认: 6193): ").strip() or "6193"
    region = input(f"请输入 region (默认: {DEFAULT_REGION}): ").strip().upper() or DEFAULT_REGION
    namespace = input("请输入 namespace (默认: activity): ").strip() or "activity"

    print(f"\n开始查询...")
    print(f"  key: {key}")
    print(f"  region: {region}")
    print(f"  namespace: {namespace}")
    print()

    # 调用接口
    get_key(key=key, region=region, namespace=namespace, verbose=True)


if __name__ == "__main__":
    main()
