package com.zksy.base.warning.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zksy.base.warning.domain.EarlyWarning;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface EarlyWarningMapper extends BaseMapper<EarlyWarning> {

    IPage<Map<String, Object>> selectWarningList(Page<?> page, @Param("warningName") String warningName, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("status") String status);

    IPage<Map<String, Object>> searchWarnings(Page<?> page, @Param("warningName") String warningName, @Param("warningNo") String warningNo, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("status") String status, @Param("location") String location, @Param("publisher") String publisher, @Param("ownershipUnit") String ownershipUnit, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    IPage<Map<String, Object>> selectTodoList(Page<?> page, @Param("userId") String userId, @Param("todoType") String todoType, @Param("warningName") String warningName);

    IPage<Map<String, Object>> selectProcessingWarnings(Page<?> page, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel);

    IPage<Map<String, Object>> selectCompletedWarnings(Page<?> page, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    Map<String, Object> selectWarningDetail(@Param("warningId") String warningId);

    List<Map<String, Object>> selectStatistics();

    /**
     * 统计今日预警核心指标
     * @return 包含今日预警总数、已处置数、已解除数的Map
     */
    Map<String, Object> selectTodayWarningStats();

    /**
     * 查询今日预警列表（支持按状态筛选）
     * @param status 预警状态，为空则查询所有非草稿状态
     */
    List<EarlyWarning> selectTodayWarningList(@Param("status") String status);

    /**
     * 按日统计预警发展趋势（按专项分组）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param warningSpecial 预警专项（可选）
     */
    List<Map<String, Object>> selectWarningTrendByDay(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial);

    /**
     * 按月统计预警发展趋势（按专项分组）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param warningSpecial 预警专项（可选）
     */
    List<Map<String, Object>> selectWarningTrendByMonth(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial);

    /**
     * 按处置状态分组统计预警数量
     * @param startTime 开始发布时间
     * @param endTime 结束发布时间
     * @param warningSpecial 预警专项（可选）
     * @return 分组结果：status状态、count数量
     */
    List<Map<String, Object>> selectWarningGroupByStatus(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial);

    /**
     * 处置时效分析-概览指标统计
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningSpecial 预警专项（可选）
     * @return 平均/最长/最短处置时长 + 总数
     */
    Map<String, Object> selectDisposeEfficiencyOverview(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial);

    /**
     * 处置时效分析-时效区间分布统计
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningSpecial 预警专项（可选）
     * @return 各时长区间预警数量
     */
    List<Map<String, Object>> selectDisposeEfficiencyRange(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial);

    /**
     * 处置时效分析-按预警专项统计平均时效
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @return 各专项平均处置时长
     */
    List<Map<String, Object>> selectDisposeEfficiencyBySpecial(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 处置时效分析-明细列表
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningSpecial 预警专项（可选）
     * @param sortType 排序方式 asc-时效从短到长 desc-时效从长到短
     * @return 预警时效明细
     */
    List<Map<String, Object>> selectDisposeEfficiencyList(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningSpecial") String warningSpecial,
            @Param("sortType") String sortType);

    /**
     * 接警效率分析-概览指标统计
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningType 预警类型（可选）
     * @param warningSpecial 预警专项（可选）
     * @param status 处置状态（可选）
     * @return 平均/最长/最短接警时长 + 接警总数
     */
    Map<String, Object> selectReceiveEfficiencyOverview(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningType") String warningType,
            @Param("warningSpecial") String warningSpecial,
            @Param("status") String status);

    /**
     * 接警效率分析-时效区间分布统计
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningType 预警类型（可选）
     * @param warningSpecial 预警专项（可选）
     * @param status 处置状态（可选）
     * @return 各时长区间预警数量
     */
    List<Map<String, Object>> selectReceiveEfficiencyRange(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningType") String warningType,
            @Param("warningSpecial") String warningSpecial,
            @Param("status") String status);

    /**
     * 接警效率分析-按预警类型统计平均时效
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @return 各类型平均接警时长、数量
     */
    List<Map<String, Object>> selectReceiveEfficiencyByType(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 接警效率分析-明细列表
     * @param startTime 发布开始时间
     * @param endTime 发布结束时间
     * @param warningType 预警类型（可选）
     * @param warningSpecial 预警专项（可选）
     * @param status 处置状态（可选）
     * @param sortType 排序方式 asc-时效从短到长 desc-时效从长到短
     * @return 预警接警时效明细
     */
    List<Map<String, Object>> selectReceiveEfficiencyList(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("warningType") String warningType,
            @Param("warningSpecial") String warningSpecial,
            @Param("status") String status,
            @Param("sortType") String sortType);
}
