/**
 * 格子仿画工具函数
 * 提供对称图案生成等功能
 */

import { GridCell, GridConfig, ShapeTemplate } from '../types/gridTypes';

/**
 * 移除重复的格子（保留最后一个）
 */
function removeDuplicateCells(cells: GridCell[]): GridCell[] {
    const cellMap = new Map<string, GridCell>();

    // 从后往前遍历，保留最后出现的格子
    for (let i = cells.length - 1; i >= 0; i--) {
        const cell = cells[i];
        const key = `${cell.x},${cell.y}`;
        if (!cellMap.has(key)) {
            cellMap.set(key, cell);
        }
    }

    return Array.from(cellMap.values());
}

/**
 * 根据对称轴类型，将半部分图案补全为完整图案
 * @param halfCells 半部分格子的数据（通常是左半部分或上半部分）
 * @param config 网格配置
 * @param symmetryType 对称类型
 * @returns 完整的格子数据
 */
export function generateSymmetricalPattern(
    halfCells: GridCell[],
    config: GridConfig,
    symmetryType: 'vertical' | 'horizontal' | 'both',
): GridCell[] {
    const result: GridCell[] = [...halfCells];
    const { rows, cols } = config;

    if (symmetryType === 'vertical' || symmetryType === 'both') {
        // 垂直对称（关于中间列对称）
        const verticalAxis = Math.floor(cols / 2);
        const cellsToAdd: GridCell[] = [];

        for (const cell of halfCells) {
            // 如果格子不在对称轴上，生成对称的格子
            if (cell.x < verticalAxis) {
                const symmetricX = cols - 1 - cell.x;
                cellsToAdd.push({
                    x: symmetricX,
                    y: cell.y,
                    color: cell.color,
                });
            }
        }
        result.push(...cellsToAdd);
    }

    if (symmetryType === 'horizontal' || symmetryType === 'both') {
        // 水平对称（关于中间行对称）
        const horizontalAxis = Math.floor(rows / 2);
        const cellsToAdd: GridCell[] = [];

        for (const cell of result) {
            // 如果格子不在对称轴上，生成对称的格子
            if (cell.y < horizontalAxis) {
                const symmetricY = rows - 1 - cell.y;
                cellsToAdd.push({
                    x: cell.x,
                    y: symmetricY,
                    color: cell.color,
                });
            }
        }
        result.push(...cellsToAdd);
    }

    // 去重（避免对称轴上的格子重复）
    return removeDuplicateCells(result);
}

/**
 * 从形状模板生成完整的格子数据
 * @param template 形状模板
 * @param config 网格配置（用于对称生成）
 * @returns 完整的格子数据
 */
export function generateCompletePattern(
    template: ShapeTemplate,
    config: GridConfig,
): GridCell[] {
    if (template.isComplete) {
        // 如果已经是完整图案，直接返回
        return [...template.cells];
    }

    if (template.supportSymmetry && template.symmetryType) {
        // 使用对称生成完整图案
        return generateSymmetricalPattern(
            template.cells,
            config,
            template.symmetryType,
        );
    }

    // 如果不支持对称，返回原数据
    return [...template.cells];
}
