package com.zksy.drainage.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zksy.drainage.domain.DrainageWarning;
import com.zksy.drainage.domain.WarningScopeUser;

import java.util.List;

/**
 * 排水预警信息 Service接口
 */
public interface DrainageWarningService extends IService<DrainageWarning> {

    /**
     * 分页查询预警信息
     *
     * @param pageNum       页码
     * @param pageSize      每页数量
     * @param warningLevel  预警级别
     * @param warningType   预警类型
     * @param status        状态（字符串）
     * @param startTime     开始时间（yyyy-MM-dd HH:mm:ss）
     * @param endTime       结束时间（yyyy-MM-dd HH:mm:ss）
     */
    Page<DrainageWarning> findByPage(long pageNum, long pageSize,
                                     Integer warningLevel, String warningType,
                                     String status, String startTime, String endTime);

    /**
     * 查询当前预警（status IN DRAFT/PENDING/PROCESSING/RELEASED）
     */
    Page<DrainageWarning> findCurrentPage(long pageNum, long pageSize,
                                          Integer warningLevel, String warningType);

    /**
     * 查询历史预警（status IN HANDLED/CLOSED）
     *
     * @param historyOnly   为true时强制限定 status IN ('HANDLED','CLOSED')
     */
    Page<DrainageWarning> findHistoryPage(long pageNum, long pageSize,
                                          Integer warningLevel, String warningType,
                                          String status, String startTime, String endTime,
                                          boolean historyOnly, String equipmentName);

    /**
     * 发布新预警（自动生成预警编号、设置发布时间和默认状态）
     */
    boolean saveWithCheck(DrainageWarning entity);

    /**
     * 修改预警
     */
    boolean updateWithCheck(DrainageWarning entity);

    /**
     * 更新预警状态
     *
     * @param id        预警ID
     * @param status    新状态（字符串：DRAFT/PENDING/PROCESSING/RELEASED/HANDLED/CLOSED）
     * @param processor 处理人
     */
    boolean updateStatus(String id, String status, String processor);

    /**
     * 删除预警
     */
    boolean removeWithCheck(String id);

    /**
     * 发布预警（带接收人员列表）
     * publish_scope=2相关部门时，scopeDeptId由warning对象携带
     * publish_scope=3指定人员时，userIds为接收人员ID列表
     *
     * @param warning 预警信息
     * @param userIds 接收人员ID列表（publish_scope=3时必填）
     */
    void publishWarning(DrainageWarning warning, List<Long> userIds);

    /**
     * 查询当前用户可见的预警（按用户ID和部门ID过滤）
     * - admin：看所有预警
     * - 普通用户：看 publish_scope=2 且部门匹配 或 publish_scope=3 且被指定的预警
     * - currentOnly=true 时限定 status IN ('DRAFT','PENDING','PROCESSING','RELEASED')
     * - status 参数用于前端 Tab 筛选，为 null 时返回所有符合的状态
     *
     * @param pageNum       页码
     * @param pageSize      每页数量
     * @param userId        当前用户ID
     * @param deptId        当前用户部门ID（可为null）
     * @param isAdmin       是否管理员
     * @param warningLevel  预警级别
     * @param warningType   预警类型
     * @param status        状态筛选（字符串），为null时不筛选状态
     * @param currentOnly   为true时限定返回当前预警（未处置的）
     * @param equipmentName 设备名称（模糊查询）
     * @param startTime     开始时间
     * @param endTime       结束时间
     */
    Page<DrainageWarning> findVisibleCurrentPage(long pageNum, long pageSize,
                                                  Long userId, Long deptId, boolean isAdmin,
                                                  Integer warningLevel, String warningType,
                                                  String status, boolean currentOnly,
                                                  String equipmentName, String startTime, String endTime);

    /**
     * 处理（指定人员处理）
     * 更新 status=1, first_approver, first_approver_name, first_approve_time
     *
     * @param warningId 预警ID
     * @param userId    处理人ID
     * @param userName  处理人名称
     */
    void firstApprove(String warningId, Long userId, String userName);

    /**
     * 审批（管理员审批）
     * 更新 status=2, final_approver, final_approver_name, final_approve_time
     * 完成后进入历史预警
     *
     * @param warningId 预警ID
     * @param userId    审批人ID（管理员）
     * @param userName  审批人名称
     */
    void finalApprove(String warningId, Long userId, String userName);

    /**
     * 获取某预警的接收人员列表
     *
     * @param warningId 预警ID
     */
    List<WarningScopeUser> findScopeUsers(String warningId);
}
