#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
易收米支付SDK使用演示

这个demo展示了如何使用易收米支付SDK的各个功能：
1. 创建支付订单
2. 查询订单状态  
3. 处理支付回调

运行前请确保安装依赖：
pip install aiohttp fastapi uvicorn

使用方法：
python demo.py
"""

import json
import time
import asyncio
from pay import create_payment
from query import query_order
from notify import PaymentNotify

class YsmPayDemo:
    """易收米支付演示类"""
    
    def __init__(self):
        # 配置信息 - 请替换为你的真实配置
        self.appid = 'YSMcd16b45d'  # 支付通道ID
        self.appsecret = '899850e778e8d2b53e4c4a4e88695688'  # AppSecret
        
        # 回调地址配置
        self.notify_url = "http://your-domain.com/notify"
        self.nopay_url = "http://your-domain.com/cancel"
        self.callback_url = "http://your-domain.com/success"
    
    async def demo_create_payment(self):
        """演示创建支付订单"""
        print("\n=== 创建支付订单演示 ===")
        
        # 生成唯一订单号
        order_id = f"demo_{int(time.time())}"
        
        try:
            # 创建支付
            pay_url = await create_payment(
                appid=self.appid,
                appsecret=self.appsecret,
                order_id=order_id,
                description="演示商品 - 快充数据线",
                amount=100,  # 1元 = 100分
                notify_url=self.notify_url,
                nopay_url=self.nopay_url,
                callback_url=self.callback_url,
                pay_type=1  # 微信内支付
            )
            
            if pay_url:
                print(f"✅ 支付订单创建成功")
                print(f"📋 订单号: {order_id}")
                print(f"💰 金额: 1.00元")
                print(f"🔗 支付链接: {pay_url}")
                return order_id, pay_url
            else:
                print("❌ 支付订单创建失败")
                return None, None
                
        except Exception as e:
            print(f"❌ 创建支付时出错: {str(e)}")
            return None, None
    
    async def demo_query_order(self, order_id):
        """演示查询订单状态"""
        print(f"\n=== 查询订单状态演示 ===")
        print(f"🔍 查询订单: {order_id}")
        
        try:
            # 查询订单
            order_info = await query_order(
                appid=self.appid,
                mch_orderid=order_id
            )
            
            if order_info:
                print("✅ 订单查询成功")
                print(f"📊 订单信息:")
                print(json.dumps(order_info, ensure_ascii=False, indent=2))
                
                # 解析订单状态
                state = order_info.get('state', 'UNKNOWN')
                status_map = {
                    'SUCCESS': '✅ 支付成功',
                    'REFUND': '🔄 转入退款',
                    'NOTPAY': '⏳ 未支付',
                    'CLOSED': '❌ 已关闭',
                }
                
                # 检查是否是错误响应
                if 'code' in order_info and order_info.get('code') == 'ORDER_NOT_EXIST':
                    print(f"💡 订单状态: ⚠️ 订单不存在（演示订单，正常现象）")
                else:
                    print(f"💡 订单状态: {status_map.get(state, f'未知状态({state})')}")
                
                return order_info
            else:
                print("❌ 订单查询失败")
                return None
                
        except Exception as e:
            print(f"❌ 查询订单时出错: {str(e)}")
            return None
    
    async def demo_payment_notify(self):
        """演示支付回调处理"""
        print(f"\n=== 支付回调处理演示 ===")
        
        # 模拟支付成功的回调数据
        mock_notify_data = {
            "appid": self.appid,
            "mch_orderid": "demo_1234567890",
            "ysm_orderid": "YSM20240101123456",
            "total": 100,
            "state": "SUCCESS",
            "time": int(time.time()),
            "nonce_str": "abc123456"
        }
        
        # 添加签名
        from api import YsmPayApi
        mock_notify_data['hash'] = YsmPayApi.hash_sign(mock_notify_data, self.appsecret)
        
        print(f"📨 模拟回调数据:")
        print(json.dumps(mock_notify_data, ensure_ascii=False, indent=2))
        
        # 创建通知处理器
        notify_handler = PaymentNotify(self.appid, self.appsecret)
        
        # 处理回调
        try:
            # 使用异步调用
            success, message = await notify_handler.process(mock_notify_data)
            
            if success:
                print(f"✅ 回调处理成功: {message}")
            else:
                print(f"❌ 回调处理失败: {message}")
                
            return success, message
            
        except Exception as e:
            print(f"❌ 处理回调时出错: {str(e)}")
            return False, str(e)
    
    def demo_payment_types(self):
        """演示不同支付类型"""
        print(f"\n=== 支付类型说明 ===")
        
        payment_types = {
            1: "微信内支付 - 适用于在微信内打开的页面",
            2: "微信扫码支付 - 生成二维码供用户扫码支付",
            3: "微信H5支付 - 适用于手机浏览器(非微信内)",
            11: "支付宝H5支付 - 适用于手机浏览器跳转支付宝"
        }
        
        for pay_type, description in payment_types.items():
            print(f"💳 pay_type={pay_type}: {description}")
    
    async def run_full_demo(self):
        """运行完整演示"""
        print("🚀 易收米支付SDK演示开始")
        print("=" * 50)
        
        # 显示配置信息
        print(f"📋 当前配置:")
        print(f"   AppID: {self.appid}")
        print(f"   AppSecret: {self.appsecret[:8]}***{self.appsecret[-8:]}")
        
        # 1. 演示支付类型
        self.demo_payment_types()
        
        # 2. 创建支付订单
        order_id, pay_url = await self.demo_create_payment()
        
        if order_id:
            # 3. 查询订单状态
            await self.demo_query_order(order_id)
        
        # 4. 演示回调处理
        await self.demo_payment_notify()
        
        print("\n" + "=" * 50)
        print("✅ 演示完成")
        
        # 提示用户
        if pay_url:
            print(f"\n💡 提示:")
            print(f"   1. 可以访问支付链接进行测试: {pay_url}")
            print(f"   2. 支付成功后可以再次查询订单状态")
            print(f"   3. 实际使用时请替换为真实的回调地址")

async def main():
    """主函数"""
    demo = YsmPayDemo()
    await demo.run_full_demo()

if __name__ == "__main__":
    # 运行演示
    asyncio.run(main())