"""
表格渲染器
"""

from typing import List
import pandas as pd
from pptx.slide import Slide
from ppt_station.models.job import TableSpec
from ppt_station.utils.template_utils import find_shape_by_name


class TableRenderer:
    """表格渲染器"""

    @staticmethod
    def render(slide: Slide, table_spec: TableSpec, df: pd.DataFrame) -> None:
        """
        渲染表格到幻灯片

        Args:
            slide: 幻灯片对象
            table_spec: 表格配置
            df: 数据 DataFrame
        """
        shape = find_shape_by_name(slide, table_spec.target)

        if not shape:
            print(f"警告: 未找到表格 '{table_spec.target}'")
            return

        if not shape.has_table:
            print(f"警告: '{table_spec.target}' 不是表格")
            return

        table = shape.table
        data = df[table_spec.columns]

        # 写入表头
        row_start = 0
        if table_spec.header:
            for j, header in enumerate(table_spec.header):
                if j < len(table.columns):
                    cell = table.cell(0, j)
                    cell.text = str(header)
            row_start = 1

        # 写入数据
        for i in range(len(data)):
            if i + row_start >= len(table.rows):
                # 如果表格行数不够，需要添加行
                print(f"警告: 表格 '{table_spec.target}' 行数不足，需要 {i + row_start + 1} 行")
                break

            for j in range(len(table_spec.columns)):
                if j < len(table.columns):
                    cell = table.cell(i + row_start, j)
                    value = data.iat[i, j]

                    # 格式化数值
                    if table_spec.number_format and table_spec.columns[j] in table_spec.number_format:
                        fmt = table_spec.number_format[table_spec.columns[j]]
                        if isinstance(value, (int, float)):
                            if "%" in fmt:
                                cell.text = f"{value:.2%}"
                            elif "#,##0" in fmt:
                                cell.text = f"{value:,.0f}"
                            else:
                                cell.text = str(value)
                        else:
                            cell.text = str(value)
                    else:
                        cell.text = str(value)
