"""
cpdtab2s 功能演示 - Subtotal 功能测试
展示如何使用 cpdtab2s 系列方法创建带 Subtotal 的 pivot table
"""

import pandas as pd
import sys
import os

# 添加路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))

from pandaspro.core.frame import FramePro
from pandaspro.io.excel.putexcel import PutxlSet

print("="*80)
print("cpdtab2s 功能演示 - 创建带 Subtotal 的 Pivot Table")
print("="*80)

# ============================================================================
# 创建示例数据：销售数据
# ============================================================================
print("\n📊 创建示例数据...")

data = []
regions = ['华北', '华东', '华南']
categories = ['电子产品', '家具']
products = ['产品A', '产品B']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']

sales_base = 100
for region in regions:
    for category in categories:
        for product in products:
            for quarter in quarters:
                data.append({
                    'Region': region,
                    'Category': category,
                    'Product': product,
                    'Quarter': quarter,
                    'Sales': sales_base + len(data) * 10,
                    'Profit': sales_base // 5 + len(data) * 2,
                    'Units': 10 + len(data),
                    'id': len(data) + 1
                })

df = FramePro(data, uid='id')

print(f"\n数据预览（前10行）:")
print(df.head(10))
print(f"\n数据形状: {df.shape}")
print(f"包含字段: {df.columns.tolist()}")

# ============================================================================
# 创建 Excel 文件
# ============================================================================
output_file = 'demo_cpdtab2s_subtotal.xlsx'
ps = PutxlSet(output_file)

# ============================================================================
# 示例 1: 基础 count - 对比有无 Subtotal
# ============================================================================
print("\n" + "="*80)
print("示例 1: 基础 count - 对比有无 Subtotal")
print("="*80)

# 1a. 不带 Subtotal
print("\n1a. cpdtab2_Region__Quarter (不带 Subtotal)")
pivot1a = df.cpdtab2_Region__Quarter
print(pivot1a)

ps.putxl(
    pivot1a,
    sheet_name='01a_Count_NoSubtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# 1b. 带 Subtotal
print("\n1b. cpdtab2s_Region__Quarter (带 Subtotal)")
pivot1b = df.cpdtab2s_Region__Quarter
print(pivot1b)

ps.putxl(
    pivot1b,
    sheet_name='01b_Count_WithSubtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 2: 多层 Index - 展示 Subtotal 效果
# ============================================================================
print("\n" + "="*80)
print("示例 2: 多层 Index - 使用 ___ 创建 MultiIndex")
print("="*80)

print("\n2. cpdtab2s_Region__Category___Quarter (多 index, 单 columns)")
pivot2 = df.cpdtab2s_Region__Category___Quarter
print(pivot2.head(15))
print(f"\nIndex names: {pivot2.index.names}")
print(f"注意：每个 Region 下都有 Subtotal 行")

ps.putxl(
    pivot2,
    sheet_name='02_MultiIndex_Subtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 3: 多层 Columns - 展示 Subtotal 列
# ============================================================================
print("\n" + "="*80)
print("示例 3: 多层 Columns - Subtotal 列")
print("="*80)

print("\n3. cpdtab2s_Region___Quarter__Product (单 index, 多 columns)")
pivot3 = df.cpdtab2s_Region___Quarter__Product
print(pivot3)
print(f"\nColumns (前8个): {pivot3.columns.tolist()[:8]}")
print(f"注意：每个 Quarter 下都有 Subtotal 列")

ps.putxl(
    pivot3,
    sheet_name='03_MultiCol_Subtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 4: Sum 聚合 - 销售额汇总
# ============================================================================
print("\n" + "="*80)
print("示例 4: Sum 聚合 - 销售额汇总带 Subtotal")
print("="*80)

# 4a. 不带 Subtotal
print("\n4a. cpdtab2sum_Region__Category__Sales (不带 Subtotal)")
pivot4a = df.cpdtab2sum_Region__Category__Sales
print(pivot4a.head(8))

ps.putxl(
    pivot4a,
    sheet_name='04a_Sum_NoSubtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# 4b. 带 Subtotal
print("\n4b. cpdtab2ssum_Region__Category__Sales (带 Subtotal)")
pivot4b = df.cpdtab2ssum_Region__Category__Sales
print(pivot4b.head(10))

ps.putxl(
    pivot4b,
    sheet_name='04b_Sum_WithSubtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 5: Mean 聚合 - 利润率分析
# ============================================================================
print("\n" + "="*80)
print("示例 5: Mean 聚合 - 平均利润分析")
print("="*80)

print("\n5. cpdtab2smean_Region__Category___Quarter__Profit")
pivot5 = df.cpdtab2smean_Region__Category___Quarter__Profit
print(pivot5.head(15))

ps.putxl(
    pivot5,
    sheet_name='05_Mean_Subtotal',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 6: 复杂场景 - 多维 Index 和 Columns
# ============================================================================
print("\n" + "="*80)
print("示例 6: 复杂场景 - 多维度分析")
print("="*80)

print("\n6. cpdtab2ssum_Region__Category__Product___Quarter__Sales")
pivot6 = df.cpdtab2ssum_Region__Category__Product___Quarter__Sales
print(pivot6.head(20))
print(f"\nIndex names: {pivot6.index.names}")
print(f"Columns (前6个): {pivot6.columns.tolist()[:6]}")
print("\n注意：")
print("  - 每个 Region 都有 Subtotal 行")
print("  - 每个 Quarter 都有 Subtotal 列")
print("  - Total 行和列保持不变")

ps.putxl(
    pivot6,
    sheet_name='06_Complex_MultiSub',
    cell='A1',
    index=True,
    auto_format=True
)

# ============================================================================
# 示例 7: 实际应用 - 结合条件格式化
# ============================================================================
print("\n" + "="*80)
print("示例 7: 实际应用 - 结合条件格式化高亮 Subtotal")
print("="*80)

print("\n7. 带条件格式的 pivot table")
pivot7 = df.cpdtab2ssum_Region__Category___Quarter__Product__Sales

ps.putxl(
    pivot7,
    sheet_name='07_WithFormatting',
    cell='A1',
    index=True,
    auto_format=True,
    cd_format={
        'index_level': 'Category',
        'value': 'Subtotal',
        'fill': '#FFEB9C'  # 浅黄色高亮 Subtotal 行
    }
)

print(f"\n✅ Subtotal 行已用浅黄色高亮")

# ============================================================================
# 保存并关闭
# ============================================================================
ps.close()

print("\n" + "="*80)
print(f"✅ 演示完成！Excel 文件已生成: {output_file}")
print("="*80)

print("\n📋 包含的工作表:")
print("  01a_Count_NoSubtotal    - 基础 count（无 Subtotal）")
print("  01b_Count_WithSubtotal  - 基础 count（有 Subtotal）")
print("  02_MultiIndex_Subtotal  - 多层 Index 的 Subtotal 行")
print("  03_MultiCol_Subtotal    - 多层 Columns 的 Subtotal 列")
print("  04a_Sum_NoSubtotal      - Sum 聚合（无 Subtotal）")
print("  04b_Sum_WithSubtotal    - Sum 聚合（有 Subtotal）")
print("  05_Mean_Subtotal        - Mean 聚合 + Subtotal")
print("  06_Complex_MultiSub     - 复杂多维 Subtotal")
print("  07_WithFormatting       - 结合条件格式化")

print("\n🎯 关键特性:")
print("  ✓ Subtotal 自动计算第一级分组的小计")
print("  ✓ 支持所有聚合函数（sum, mean, min, max 等）")
print("  ✓ 支持 MultiIndex（多层 index 和 columns）")
print("  ✓ 与 auto_format 完美配合")
print("  ✓ 可以用条件格式化高亮 Subtotal 行")

print("\n💡 使用技巧:")
print("  • 用 ___ 分隔 index 和 columns 字段")
print("  • cpdtab2s_  → count + subtotal")
print("  • cpdtab2ssum_  → sum + subtotal")
print("  • cpdtab2smean_ → mean + subtotal")
print("  • 以此类推...")

print("\n请打开 Excel 文件查看效果！")
print("="*80)

