#!/usr/bin/env python
"""
创建测试验证的Excel文件
"""
import pandas as pd
from pathlib import Path
import numpy as np
from datetime import datetime, timedelta

# 创建测试文件目录
test_dir = Path("/Users/jinjunqian/PycharmProjects/订单处理新版/ordersys/test_files")
test_dir.mkdir(exist_ok=True)

# 1. 创建缺少必需列的文件
def create_missing_columns_file():
    """缺少必需列：原始订单编号"""
    df = pd.DataFrame({
        '线上宝贝名称': ['商品A', '商品B', '商品C'],
        '数量': [1, 2, 3],
        '订单单价': [100, 200, 300],
        '付款时间': ['2025-01-01 10:00:00', '2025-01-01 11:00:00', '2025-01-01 12:00:00'],
        '网店名称': ['店铺1', '店铺1', '店铺2']
    })
    file_path = test_dir / "test_missing_columns.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 2. 创建空值过多的文件
def create_too_many_nulls_file():
    """必需字段空值超过10%"""
    df = pd.DataFrame({
        '原始订单编号': ['1001', '1002', None, None, '1005', None, None, None, None, '1010'],
        '线上宝贝名称': ['商品A', '商品B', '商品C', '商品D', '商品E', '商品F', '商品G', '商品H', '商品I', '商品J'],
        '数量': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        '订单单价': [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000],
        '付款时间': ['2025-01-01 10:00:00'] * 10
    })
    file_path = test_dir / "test_too_many_nulls.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 3. 创建数据类型错误的文件
def create_invalid_data_types_file():
    """数量字段包含非数值"""
    df = pd.DataFrame({
        '原始订单编号': ['2001', '2002', '2003', '2004', '2005'],
        '线上宝贝名称': ['商品A', '商品B', '商品C', '商品D', '商品E'],
        '数量': ['一个', '两个', 3, 'four', 5],  # 非数值数据
        '订单单价': [100, 200, '三百', 400, 500],  # 混合类型
        '付款时间': ['2025-01-01 10:00:00', 'invalid_date', '2025-01-02', '2025-01-03', '2025-01-04']
    })
    file_path = test_dir / "test_invalid_data_types.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 4. 创建业务逻辑错误的文件
def create_business_logic_errors_file():
    """订单金额计算错误，退款金额超过订单金额"""
    df = pd.DataFrame({
        '原始订单编号': ['3001', '3002', '3003', '3004', '3005'],
        '线上宝贝名称': ['商品A', '商品B', '商品C', '商品D', '商品E'],
        '数量': [2, 3, 1, 5, 2],
        '订单单价': [100, 200, 300, 100, 250],
        '订单金额': [500, 800, 300, 600, 500],  # 应该是200, 600, 300, 500, 500
        '付款时间': ['2025-01-01 10:00:00'] * 5,
        '退款金额': [0, 0, 500, 0, 600],  # 3003和3005的退款金额超过订单金额
        '交易状态': ['交易成功', '交易成功', '交易成功', '交易成功', '交易成功'],
        '退款状态': ['无退款', '无退款', '退款成功', '无退款', '退款成功']
    })
    file_path = test_dir / "test_business_logic_errors.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 5. 创建负数数据的文件
def create_negative_values_file():
    """包含负数的数量和价格"""
    df = pd.DataFrame({
        '原始订单编号': ['4001', '4002', '4003', '4004', '4005'],
        '线上宝贝名称': ['商品A', '商品B', '商品C', '商品D', '商品E'],
        '数量': [-1, 2, 3, -5, 1],  # 负数数量
        '订单单价': [100, -200, 300, 100, 250],  # 负数价格
        '付款时间': ['2025-01-01 10:00:00'] * 5
    })
    file_path = test_dir / "test_negative_values.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 6. 创建未来日期的文件
def create_future_dates_file():
    """包含未来的付款时间"""
    future_date = (datetime.now() + timedelta(days=30)).strftime('%Y-%m-%d %H:%M:%S')
    df = pd.DataFrame({
        '原始订单编号': ['5001', '5002', '5003', '5004', '5005'],
        '线上宝贝名称': ['商品A', '商品B', '商品C', '商品D', '商品E'],
        '数量': [1, 2, 3, 4, 5],
        '订单单价': [100, 200, 300, 400, 500],
        '付款时间': [future_date] * 5  # 未来日期
    })
    file_path = test_dir / "test_future_dates.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 7. 创建完全空的文件
def create_empty_file():
    """完全空的Excel文件"""
    df = pd.DataFrame()
    file_path = test_dir / "test_empty.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 8. 创建有效数据行过少的文件
def create_too_few_valid_rows_file():
    """有效数据行少于50%"""
    df = pd.DataFrame({
        '原始订单编号': [None] * 10 + ['6001', '6002'],
        '线上宝贝名称': [None] * 10 + ['商品A', '商品B'],
        '数量': [None] * 10 + [1, 2],
        '订单单价': [None] * 10 + [100, 200],
        '付款时间': [None] * 10 + ['2025-01-01 10:00:00', '2025-01-01 11:00:00']
    })
    file_path = test_dir / "test_too_few_valid_rows.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 9. 创建正常的有效文件
def create_valid_file():
    """完全有效的文件"""
    df = pd.DataFrame({
        '原始订单编号': [f'700{i}' for i in range(1, 21)],
        '线上宝贝名称': [f'Tods女鞋{i}' for i in range(1, 21)],
        '线上销售属性': ['颜色:黑色;尺码:36'] * 20,
        '线上商家编码': [f'TOD-{i:04d}' for i in range(1, 21)],
        '数量': [1] * 20,
        '订单单价': [i * 100 for i in range(1, 21)],
        '订单金额': [i * 100 for i in range(1, 21)],
        '付款时间': ['2025-01-01 10:00:00'] * 20,
        '网店名称': ['旗舰店'] * 20,
        '交易状态': ['交易成功'] * 20,
        '退款状态': ['无退款'] * 20,
        '实付金额': [i * 100 for i in range(1, 21)]
    })
    file_path = test_dir / "test_valid.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 10. 创建警告级别的文件（有问题但不严重）
def create_warning_level_file():
    """有警告但可以导入的文件"""
    df = pd.DataFrame({
        '原始订单编号': ['8001', '8002', '8003', '8004', '8005', '8005'],  # 有重复
        '线上宝贝名称': ['商品A', '商品B', 'AB', '商品D', '商品E'],  # 有短名称
        '数量': [1, 2, 3.5, 4, 5],  # 有非整数
        '订单单价': [100, 200, 300, 400, 500],
        '付款时间': ['2019-01-01 10:00:00', '2025-01-01', '2025-01-01', '2025-01-01', '2025-01-01'],  # 有过早日期
        '网店名称': ['店铺1', '店铺1', '店铺2', None, '店铺3']  # 有空值但不是必需字段
    })
    file_path = test_dir / "test_warning_level.xlsx"
    df.to_excel(file_path, index=False)
    print(f"Created: {file_path}")
    return file_path

# 执行创建所有测试文件
if __name__ == "__main__":
    print("Creating test Excel files for validation testing...")
    print("=" * 60)

    files = {
        "missing_columns": create_missing_columns_file(),
        "too_many_nulls": create_too_many_nulls_file(),
        "invalid_data_types": create_invalid_data_types_file(),
        "business_logic_errors": create_business_logic_errors_file(),
        "negative_values": create_negative_values_file(),
        "future_dates": create_future_dates_file(),
        "empty": create_empty_file(),
        "too_few_valid_rows": create_too_few_valid_rows_file(),
        "valid": create_valid_file(),
        "warning_level": create_warning_level_file()
    }

    print("=" * 60)
    print(f"Created {len(files)} test files in {test_dir}")

    # 输出文件列表
    print("\nTest files created:")
    for name, path in files.items():
        print(f"  - {name}: {path.name}")