package com.cf.imes.module.report.dal.mysql.template;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore;
import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO;
import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.CF_ORGANID;

/**
 * 报表模板信息 Mapper
 *
 * @author Gqr
 * @since 2024/7/3 11:43
 */
@Mapper
public interface ReportTemplateMapper extends BaseMapperX<ReportTemplateDO> {

    /**
     * 根据模板id查询模板
     * 普通用户用：organId+type：1 or type：0
     *
     * @param id 模板id
     * @return
     */
    @OrganIgnore
    default ReportTemplateDO selectNormalTemplateById(Long id, Long organId) {
        ReportTemplateDO result = null;

        // 1. 先查 CUSTOM（当前组织）
        LambdaQueryWrapper<ReportTemplateDO> customWrapper = new LambdaQueryWrapper<ReportTemplateDO>()
                .eq(ReportTemplateDO::getId, id)
                .eq(ReportTemplateDO::getOrganId, organId)
                .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM);

        result = selectOne(customWrapper);

        // 2. 查不到再查 SYSTEM（固定组织）
        if (result == null) {
            LambdaQueryWrapper<ReportTemplateDO> systemWrapper = new LambdaQueryWrapper<ReportTemplateDO>()
                    .eq(ReportTemplateDO::getId, id)
                    .eq(ReportTemplateDO::getOrganId, CF_ORGANID)
                    .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM);

            result = selectOne(systemWrapper);
        }

        return result;
    }

    /**
     * 查询模板列表
     * 普通用户用：organId+type：1 or type：0
     *
     * @param name
     * @param organId
     * @return
     */
    @OrganIgnore
    default List<ReportTemplateDO> selectNormalTemplateList(String name, Long organId) {
        List<ReportTemplateDO> result = new ArrayList<>();

        // 1. CUSTOM（当前组织）
        List<ReportTemplateDO> customList = selectList(
                new LambdaQueryWrapperX<ReportTemplateDO>()
                        .likeIfPresent(ReportTemplateDO::getName, name)
                        .eq(ReportTemplateDO::getOrganId, organId)
                        .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM)
                        .select(
                                ReportTemplateDO::getId,
                                ReportTemplateDO::getName,
                                ReportTemplateDO::getCreateTime,
                                ReportTemplateDO::getRemark,
                                ReportTemplateDO::getType
                        )
        );

        // 2. SYSTEM（系统模板）
        List<ReportTemplateDO> systemList = selectList(
                new LambdaQueryWrapperX<ReportTemplateDO>()
                        .likeIfPresent(ReportTemplateDO::getName, name)
                        .eq(ReportTemplateDO::getOrganId, CF_ORGANID)
                        .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM)
                        .select(
                                ReportTemplateDO::getId,
                                ReportTemplateDO::getName,
                                ReportTemplateDO::getCreateTime,
                                ReportTemplateDO::getRemark,
                                ReportTemplateDO::getType
                        )
        );

        // 3. 合并（去重，防止 id 冲突）
        Map<Long, ReportTemplateDO> map = new LinkedHashMap<>();

        if (CollUtil.isNotEmpty(customList)) {
            customList.forEach(e -> map.put(e.getId(), e));
        }

        if (CollUtil.isNotEmpty(systemList)) {
            systemList.forEach(e -> map.putIfAbsent(e.getId(), e));
        }

        result.addAll(map.values());

        // 4. 排序（保持原 SQL 行为）
        result.sort(Comparator.comparing(ReportTemplateDO::getCreateTime).reversed());

        return result;
    }

    /**
     * 根据id物理删除report_template
     *
     * @param id
     * @return 改动数量
     */
    @Delete("DELETE FROM report_template WHERE id = #{id} AND organ_id = #{organId}")
    int physicalDeleteById(@Param("id") Long id, @Param("organId") Long organId);
}
