#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
创建算子配置 Excel 模板

使用方法:
    python create_operator_template.py

生成文件:
    operator_config_template.xlsx
"""

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment

def create_template():
    """创建算子配置 Excel 模板"""
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "算子配置"

    # 设置列宽
    ws.column_dimensions['A'].width = 25  # 算子名称
    ws.column_dimensions['B'].width = 15  # 所属仓
    ws.column_dimensions['C'].width = 30  # 输入格式
    ws.column_dimensions['D'].width = 30  # 输入类型
    ws.column_dimensions['E'].width = 30  # 输出格式
    ws.column_dimensions['F'].width = 30  # 输出类型
    ws.column_dimensions['G'].width = 40  # 备注

    # 表头
    headers = ["算子名称", "所属仓", "输入格式", "输入类型", "输出格式", "输出类型", "备注"]
    header_font = Font(bold=True, color="FFFFFF")
    header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
    header_alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

    for col, header in enumerate(headers, start=1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = header_alignment

    # 示例数据
    examples = [
        ["Add", "op-arithmetic", "NCHW,ND", "FLOAT16,FLOAT32,INT32", "", "", "支持多种输入格式和类型"],
        ["Conv2D", "op-nn", "NCHW,NHWC", "FLOAT16,FLOAT32", "NCHW,NHWC", "FLOAT16,FLOAT32", "卷积算子"],
        ["LayerNorm", "op-nn", "ND", "FLOAT16,FLOAT32", "ND", "FLOAT16,FLOAT32", "归一化算子,需要gamma/beta参数"],
        ["MatMul", "op-nn", "ND", "FLOAT16,FLOAT32,INT32", "ND", "FLOAT16,FLOAT32", "矩阵乘法"],
        ["Resize", "op-vision", "NCHW,NHWC", "FLOAT16,FLOAT32,UINT8", "NCHW,NHWC", "FLOAT16,FLOAT32", "图像缩放算子"],
        ["Cast", "op-conversion", "", "ALL", "", "ALL", "类型转换算子,支持所有类型"],
        ["Transpose", "op-conversion", "ND", "FLOAT16,FLOAT32,INT32,INT8,UINT8", "ND", "FLOAT16,FLOAT32,INT32,INT8,UINT8", "转置算子"],
    ]

    for row_idx, example in enumerate(examples, start=2):
        for col_idx, value in enumerate(example, start=1):
            ws.cell(row=row_idx, column=col_idx, value=value)

    # 添加说明工作表
    info_ws = wb.create_sheet("配置说明")

    info = [
        ["算子配置 Excel 说明"],
        [""],
        ["列说明:"],
        ["A. 算子名称", "算子的标准名称,如 Add, Conv2D 等"],
        ["B. 所属仓", "算子所属的仓目录,如 op-nn, op-arithmetic 等"],
        ["C. 输入格式", "支持的输入数据格式,用逗号分隔,如 NCHW,NHWC,ND"],
        ["   可选值:", "NCHW, NHWC, ND, NC1KHKWHC0 等"],
        ["   留空:", "表示不限制格式"],
        ["D. 输入类型", "支持的输入数据类型,用逗号分隔,如 FLOAT16,FLOAT32,INT32"],
        ["   可选值:", "FLOAT16, FLOAT32, INT32, INT8, UINT8, BOOL, ALL 等"],
        ["   留空:", "表示不限制类型"],
        ["E. 输出格式", "支持的输出数据格式,用逗号分隔"],
        ["F. 输出类型", "支持的输出数据类型,用逗号分隔"],
        ["G. 备注", "其他说明信息"],
        [""],
        ["使用示例:"],
        ["1. 只支持特定格式", "在输入格式列填写: NCHW,NHWC"],
        ["2. 支持所有类型", "在输入类型列填写: ALL"],
        ["3. 不限制格式", "将输入格式列留空"],
        [""],
        ["注意事项:"],
        ["- 格式和类型使用大写"],
        ["- 多个值用英文逗号分隔"],
        ["- 确保仓目录名称正确"],
        ["- 备注信息可以包含使用说明或特殊要求"],
    ]

    for row_idx, row_data in enumerate(info, start=1):
        if isinstance(row_data, list):
            for col_idx, value in enumerate(row_data, start=1):
                cell = info_ws.cell(row=row_idx, column=col_idx, value=value)
                if row_idx == 1:
                    cell.font = Font(bold=True, size=14)
                elif row_data[0].endswith(':'):
                    cell.font = Font(bold=True)
        else:
            cell = info_ws.cell(row=row_idx, column=1, value=row_data)

    info_ws.column_dimensions['A'].width = 20
    info_ws.column_dimensions['B'].width = 60

    # 保存文件
    output_file = "operator_config_template.xlsx"
    wb.save(output_file)
    print(f"✓ 模板已创建: {output_file}")
    print(f"\n使用说明:")
    print(f"  1. 打开 {output_file}")
    print(f"  2. 在 '算子配置' 工作表中填写算子信息")
    print(f"  3. 保存为新的配置文件,如 my_operators_config.xlsx")
    print(f"  4. 运行替换工具:python op_loge_replace.py --operator-config my_operators_config.xlsx")
    return output_file


if __name__ == "__main__":
    create_template()