#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AAA System - 通用 API 客户端 SDK
提供用户、认证、支付、AI、套餐等核心 API 调用

作者：AAA System
版本：3.4.0
"""

import requests
from typing import Dict, List, Optional, Any


class AAAClient:
    """AAA 系统通用 API 客户端"""

    def __init__(self, base_url: str = 'https://ai.your-domain.com', token: str = ''):
        self.base_url = base_url.rstrip('/')
        self.token = token
        self.session = requests.Session()
        self.session.headers.update({'Content-Type': 'application/json'})
        if token:
            self.session.headers.update({'Authorization': f'Bearer {token}'})

    def _get(self, path: str, params: dict = None) -> dict:
        resp = self.session.get(f'{self.base_url}{path}', params=params, timeout=30)
        return resp.json()

    def _post(self, path: str, data: dict = None) -> dict:
        resp = self.session.post(f'{self.base_url}{path}', json=data or {}, timeout=30)
        return resp.json()

    # ──────────────────── 认证 ────────────────────

    def login(self, phone: str, code: str = '', password: str = '') -> dict:
        """统一登录"""
        payload = {k: v for k, v in {'phone': phone, 'code': code, 'password': password}.items() if v}
        return self._post('/api/auth/unified_login', payload)

    def send_sms(self, phone: str) -> dict:
        """发送短信验证码"""
        return self._post('/api/auth/sms_send', {'phone': phone})

    def wxapp_login(self, code: str) -> dict:
        """微信小程序登录"""
        return self._post('/api/auth/wxapp_login', {'code': code})

    def verify_token(self) -> dict:
        """验证 Token 有效性"""
        return self._get('/api/auth/verify')

    # ──────────────────── 用户 ────────────────────

    def get_user_info(self) -> dict:
        return self._get('/api/user/info')

    def get_balance(self) -> dict:
        return self._get('/api/user/balance')

    def get_user_packages(self, pkg_type: str = 'all') -> dict:
        return self._get('/api/user/packages', {'type': pkg_type})

    def get_user_orders(self, page: int = 1, limit: int = 20) -> dict:
        return self._get('/api/user/orders', {'page': page, 'limit': limit})

    def get_distribution(self) -> dict:
        return self._get('/api/user/distribution')

    def withdraw_apply(self, amount: float, method: str, account: str, name: str) -> dict:
        return self._post('/api/user/distribution?action=withdraw_apply', {
            'amount': amount, 'payment_method': method,
            'payment_account': account, 'payment_name': name,
        })

    def get_api_keys(self) -> dict:
        return self._get('/api/user/apikeys')

    def get_recharge_history(self, page: int = 1, limit: int = 20) -> dict:
        return self._get('/api/user/recharge', {'page': page, 'limit': limit})

    def unified_recharge(self, amount: float, method: str = 'alipay') -> dict:
        return self._post('/api/user/unified_recharge', {
            'amount': amount, 'payment_method': method,
        })

    # ──────────────────── 支付 ────────────────────

    def create_order(self, amount: float, order_type: str = 'recharge', method: str = 'alipay') -> dict:
        return self._post('/api/pay/create', {
            'amount': amount, 'type': order_type, 'payment_method': method,
        })

    def query_order(self, order_no: str) -> dict:
        return self._get('/api/pay/query', {'order_no': order_no})

    def cancel_order(self, order_no: str) -> dict:
        """取消订单 — 仅限 wait 状态"""
        return self._post('/api/user/orders', {'action': 'cancel', 'order_no': order_no})

    def delete_order(self, order_no: str) -> dict:
        """删除订单 — 仅限 expire/cancel/completed 状态"""
        return self._post('/api/user/orders', {'action': 'delete', 'order_no': order_no})

    # ──────────────────── AI 服务 ────────────────────

    def ai_chat(self, messages: List[dict], model: str = '', stream: bool = False) -> dict:
        return self._post('/api/ai/router', {
            'messages': messages, 'model': model, 'stream': stream,
        })

    def ai_models(self) -> dict:
        return self._get('/api/ai/router', {'action': 'models'})

    def ai_deduct(self, tokens: int, model: str = '') -> dict:
        return self._post('/api/ai/deduct', {'tokens': tokens, 'model': model})

    def ai_check(self) -> dict:
        return self._get('/api/ai/check')

    # ──────────────────── 套餐 ────────────────────

    def get_packages(self, page: int = 1, limit: int = 20) -> dict:
        return self._get('/api/package/combo', {'action': 'list', 'page': page, 'limit': limit})

    def get_package_detail(self, pkg_id: int) -> dict:
        return self._get('/api/package/combo', {'action': 'detail', 'id': pkg_id})

    def purchase_package(self, package_id: int, method: str = 'alipay') -> dict:
        return self._post('/api/package/combo', {
            'action': 'purchase', 'package_id': package_id, 'payment_method': method,
        })

    def my_packages(self, page: int = 1, limit: int = 20) -> dict:
        return self._get('/api/package/combo', {'action': 'my', 'page': page, 'limit': limit})

    # ──────────────────── 公开接口 ────────────────────

    def get_public_config(self) -> dict:
        return self._get('/api/public/config')

    # ──────────────────── 工具 ────────────────────

    def set_token(self, token: str) -> 'AAAClient':
        self.token = token
        self.session.headers['Authorization'] = f'Bearer {token}'
        return self

    def set_base_url(self, url: str) -> 'AAAClient':
        self.base_url = url.rstrip('/')
        return self
