package com.agileboot.codegen.mapper;

import com.agileboot.codegen.entity.UserTemplateRepository;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 用户模板仓库 Mapper接口
 * 
 * @author system
 * @date 2025-09-26
 */
@Mapper
public interface UserTemplateRepositoryMapper extends BaseMapper<UserTemplateRepository> {

    /**
     * 查询用户的模板仓库配置
     *
     * @param userId 用户ID
     * @return 模板仓库配置列表
     */
    @Select("SELECT r.* FROM user_template_repository r " +
            "LEFT JOIN user_template ut ON r.template_source = 'user' AND r.template_id = CAST(ut.id AS CHAR) COLLATE utf8mb4_unicode_ci " +
            "WHERE r.user_id = #{userId} AND r.is_enabled = 1 " +
            "AND (r.template_source != 'user' OR (ut.id IS NOT NULL AND ut.deleted = 0)) " +
            "ORDER BY r.sort_order ASC, r.create_time ASC")
    List<UserTemplateRepository> selectEnabledByUserId(@Param("userId") Long userId);

    /**
     * 查询用户的所有模板仓库配置（包括禁用的）
     *
     * @param userId 用户ID
     * @return 模板仓库配置列表
     */
    @Select("SELECT r.* FROM user_template_repository r " +
            "LEFT JOIN user_template ut ON r.template_source = 'user' AND r.template_id = CAST(ut.id AS CHAR) COLLATE utf8mb4_unicode_ci " +
            "WHERE r.user_id = #{userId} " +
            "AND (r.template_source != 'user' OR (ut.id IS NOT NULL AND ut.deleted = 0)) " +
            "ORDER BY r.sort_order ASC, r.create_time ASC")
    List<UserTemplateRepository> selectAllByUserId(@Param("userId") Long userId);

    /**
     * 根据模板信息查询用户仓库配置
     *
     * @param userId         用户ID
     * @param templateSource 模板来源
     * @param templateId     模板ID
     * @return 模板仓库配置
     */
    @Select("SELECT * FROM user_template_repository " +
            "WHERE user_id = #{userId} AND template_source = #{templateSource} AND template_id = #{templateId}")
    UserTemplateRepository selectByTemplate(@Param("userId") Long userId, 
                                           @Param("templateSource") String templateSource, 
                                           @Param("templateId") String templateId);

    /**
     * 检查模板是否已添加到用户仓库
     *
     * @param userId         用户ID
     * @param templateSource 模板来源
     * @param templateId     模板ID
     * @return 存在的数量
     */
    @Select("SELECT COUNT(*) FROM user_template_repository " +
            "WHERE user_id = #{userId} AND template_source = #{templateSource} AND template_id = #{templateId}")
    int checkTemplateExists(@Param("userId") Long userId, 
                           @Param("templateSource") String templateSource, 
                           @Param("templateId") String templateId);

    /**
     * 切换模板启用状态
     *
     * @param userId         用户ID
     * @param templateSource 模板来源
     * @param templateId     模板ID
     * @param isEnabled      是否启用
     * @return 更新行数
     */
    @Update("UPDATE user_template_repository SET is_enabled = #{isEnabled} " +
            "WHERE user_id = #{userId} AND template_source = #{templateSource} AND template_id = #{templateId}")
    int toggleTemplateStatus(@Param("userId") Long userId, 
                            @Param("templateSource") String templateSource, 
                            @Param("templateId") String templateId, 
                            @Param("isEnabled") Integer isEnabled);

    /**
     * 批量更新模板排序
     *
     * @param userId         用户ID
     * @param templateSource 模板来源
     * @param templateId     模板ID
     * @param sortOrder      排序值
     * @return 更新行数
     */
    @Update("UPDATE user_template_repository SET sort_order = #{sortOrder} " +
            "WHERE user_id = #{userId} AND template_source = #{templateSource} AND template_id = #{templateId}")
    int updateSortOrder(@Param("userId") Long userId, 
                       @Param("templateSource") String templateSource, 
                       @Param("templateId") String templateId, 
                       @Param("sortOrder") Integer sortOrder);

    /**
     * 删除用户模板仓库配置
     *
     * @param userId         用户ID
     * @param templateSource 模板来源
     * @param templateId     模板ID
     * @return 删除行数
     */
    @Delete("DELETE FROM user_template_repository " +
            "WHERE user_id = #{userId} AND template_source = #{templateSource} AND template_id = #{templateId}")
    int deleteByTemplate(@Param("userId") Long userId, 
                        @Param("templateSource") String templateSource, 
                        @Param("templateId") String templateId);

    /**
     * 获取模板的最大排序值
     *
     * @param userId 用户ID
     * @return 最大排序值
     */
    @Select("SELECT COALESCE(MAX(sort_order), 0) FROM user_template_repository WHERE user_id = #{userId}")
    int getMaxSortOrder(@Param("userId") Long userId);
}

