#!/usr/bin/env python3
"""
数据适配器测试脚本
测试 akshare → vn.py 数据适配器的基本功能
作者：赵云（数据护军）
日期：2026-03-24
"""

import sys
import os
import logging

# 添加当前目录到路径
sys.path.insert(0, os.path.dirname(__file__))

from akshare_vnpy_adapter import AkshareToVnpyAdapter

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[logging.StreamHandler()]
)
logger = logging.getLogger(__name__)


def test_adapter():
    """测试适配器功能"""

    # 创建适配器
    db_path = '/Users/chufeng/.openclaw/workspace-pangtong/sanguo_quant_live/running_data/database_test.db'
    adapter = AkshareToVnpyAdapter(db_path)

    try:
        logger.info("=" * 60)
        logger.info("开始测试 akshare → vn.py 数据适配器")
        logger.info("=" * 60)

        # 测试1：初始化数据库
        logger.info("\n[测试1] 初始化数据库表结构...")
        adapter.initialize_database()
        logger.info("✓ 数据库初始化成功")

        # 测试2：获取股票列表
        logger.info("\n[测试2] 获取股票列表...")
        stock_list = adapter.get_stock_list()
        logger.info(f"✓ 获取到 {len(stock_list)} 只股票")
        logger.info(f"  前5只: {stock_list.head().to_string()}")

        # 测试3：测试单只股票数据获取（茅台 600519）
        logger.info("\n[测试3] 获取单只股票数据（茅台 600519）...")
        test_code = '600519'
        df = adapter.fetch_stock_daily(test_code, start_date="20250101", end_date="20250324")
        logger.info(f"✓ 获取到 {len(df)} 条K线数据")
        if len(df) > 0:
            logger.info(f"  数据列: {list(df.columns)}")
            logger.info(f"  前3条:\n{df.head(3).to_string()}")
            logger.info(f"  后3条:\n{df.tail(3).to_string()}")

        # 测试4：数据格式转换
        logger.info("\n[测试4] 数据格式转换...")
        symbol, exchange = adapter.parse_symbol(test_code)
        logger.info(f"  股票代码: {test_code} -> symbol={symbol}, exchange={exchange}")

        bars = adapter.convert_bar_to_vnpy(df, symbol, exchange, '1d')
        logger.info(f"✓ 转换了 {len(bars)} 条记录")
        if len(bars) > 0:
            logger.info(f"  第一条: {bars[0]}")

        # 测试5：批量插入
        logger.info("\n[测试5] 批量插入数据库...")
        inserted = adapter.insert_bars_bulk(bars)
        logger.info(f"✓ 成功插入 {inserted} 条记录")

        # 测试6：验证数据
        logger.info("\n[测试6] 验证数据完整性...")
        integrity = adapter.verify_data_integrity()
        logger.info(f"✓ 验证完成，状态: {integrity['status']}")

        # 测试7：完整流程测试（下载多只）
        logger.info("\n[测试7] 完整流程测试（下载5只股票）...")
        test_codes = ['000001', '000002', '600000', '600519', '600036']
        for code in test_codes:
            logger.info(f"  下载 {code}...")
            inserted = adapter.download_and_insert_stock_daily(code, start_date="20250101")
            logger.info(f"  ✓ {code}: {inserted} 条")

        # 最终验证
        logger.info("\n[最终验证] 数据完整性验证...")
        integrity = adapter.verify_data_integrity()
        logger.info("=" * 60)
        logger.info("测试完成!")
        logger.info("=" * 60)
        logger.info(f"总K线记录: {integrity['total_bars']}")
        logger.info(f"股票数量: {integrity['total_stocks']}")
        logger.info(f"时间范围: {integrity['min_date']} ~ {integrity['max_date']}")
        logger.info(f"状态: {integrity['status']}")
        logger.info("=" * 60)

        return True

    except Exception as e:
        logger.error(f"测试失败: {e}", exc_info=True)
        return False

    finally:
        adapter.close()


if __name__ == '__main__':
    success = test_adapter()
    sys.exit(0 if success else 1)
