package com.ycwl.basic.puzzle.service;

import com.ycwl.basic.integration.common.response.PageResponse;
import com.ycwl.basic.puzzle.dto.ElementCreateRequest;
import com.ycwl.basic.puzzle.dto.PuzzleElementDTO;
import com.ycwl.basic.puzzle.dto.PuzzleTemplateDTO;
import com.ycwl.basic.puzzle.dto.TemplateCreateRequest;

import java.util.List;

/**
 * 拼图模板管理服务接口
 *
 * @author Claude
 * @since 2025-01-17
 */
public interface IPuzzleTemplateService {

    /**
     * 创建模板
     */
    Long createTemplate(TemplateCreateRequest request);

    /**
     * 更新模板
     */
    void updateTemplate(Long id, TemplateCreateRequest request);

    /**
     * 删除模板（会同时删除关联的元素）
     */
    void deleteTemplate(Long id);

    /**
     * 获取模板详情（包含元素列表）
     */
    PuzzleTemplateDTO getTemplateDetail(Long id);

    /**
     * 根据编码获取模板详情
     */
    PuzzleTemplateDTO getTemplateByCode(String code);

    /**
     * 获取模板列表
     */
    List<PuzzleTemplateDTO> listTemplates(Long scenicId, String category, Integer status);

    /**
     * 分页获取模板列表
     *
     * @param page     页码(从1开始)
     * @param pageSize 每页大小
     * @param scenicId 景区ID(可选)
     * @param category 模板分类(可选)
     * @param status   状态(可选): 0-禁用 1-启用
     * @return 分页结果
     */
    PageResponse<PuzzleTemplateDTO> pageTemplates(Integer page, Integer pageSize,
                                                   Long scenicId, String category, Integer status);

    /**
     * 为模板添加元素
     */
    Long addElement(ElementCreateRequest request);

    /**
     * 批量添加元素
     */
    void batchAddElements(Long templateId, List<ElementCreateRequest> elements);

    /**
     * 批量替换元素（删除旧元素，添加新元素）
     *
     * @param templateId 模板ID
     * @param elements   新的元素列表
     */
    void replaceElements(Long templateId, List<ElementCreateRequest> elements);

    /**
     * 更新元素
     */
    void updateElement(Long id, ElementCreateRequest request);

    /**
     * 删除元素
     */
    void deleteElement(Long id);

    /**
     * 获取元素详情
     */
    PuzzleElementDTO getElementDetail(Long id);
}
