package com.agileboot.codegen.service;

import com.agileboot.codegen.dto.UserTemplateDTO;
import com.agileboot.codegen.entity.UserTemplate;
import com.agileboot.codegen.vo.UserTemplateVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;

/**
 * 用户模板 Service接口
 * 
 * @author system
 * @date 2025-09-26
 */
public interface IUserTemplateService {

    /**
     * 分页查询用户模板列表
     *
     * @param page        分页参数
     * @param userId      用户ID
     * @param templateGroup 模板分组（可选）
     * @param isPublic    是否公开（可选）
     * @return 用户模板列表
     */
    Page<UserTemplateVO> selectUserTemplateList(Page<UserTemplate> page, Long userId, String templateGroup, Integer isPublic);

    /**
     * 查询公开模板列表
     *
     * @param templateGroup 模板分组（可选）
     * @param currentUserId 当前用户ID
     * @return 公开模板列表
     */
    List<UserTemplateVO> selectPublicTemplates(String templateGroup, Long currentUserId);

    /**
     * 根据ID查询用户模板
     *
     * @param id 模板ID
     * @return 用户模板
     */
    UserTemplateVO selectUserTemplateById(Long id);

    /**
     * 新增用户模板
     *
     * @param dto 用户模板信息
     * @return 是否成功
     */
    boolean insertUserTemplate(UserTemplateDTO dto);

    /**
     * 修改用户模板
     *
     * @param dto 用户模板信息
     * @return 是否成功
     */
    boolean updateUserTemplate(UserTemplateDTO dto);

    /**
     * 删除用户模板
     *
     * @param id 模板ID
     * @return 是否成功
     */
    boolean deleteUserTemplateById(Long id);

    /**
     * 批量删除用户模板
     *
     * @param ids 模板ID数组
     * @return 是否成功
     */
    boolean deleteUserTemplateByIds(Long[] ids);

    /**
     * 复制模板（复制他人的公开模板到自己的模板库）
     *
     * @param templateId 要复制的模板ID
     * @param newName    新模板名称
     * @return 是否成功
     */
    boolean copyTemplate(Long templateId, String newName);

    /**
     * 验证模板语法
     *
     * @param templateContent 模板内容
     * @return 验证结果信息
     */
    String validateTemplate(String templateContent);

    /**
     * 检查模板名称是否存在
     *
     * @param userId       用户ID
     * @param templateName 模板名称
     * @param excludeId    排除的模板ID（更新时使用）
     * @return 是否存在
     */
    boolean checkTemplateNameExists(Long userId, String templateName, Long excludeId);

    /**
     * 增加模板使用次数
     *
     * @param id 模板ID
     */
    void increaseUseCount(Long id);

    /**
     * 切换用户模板显示状态
     *
     * @param id 模板ID
     * @param isEnabled 是否启用显示
     * @return 是否成功
     */
    boolean toggleTemplateVisibility(Long id, Integer isEnabled);

    /**
     * 获取模板内容（考虑权限控制）
     *
     * @param id 模板ID
     * @return 模板内容或权限提示
     */
    String getTemplateContent(Long id);
}

