package com.hotwj.platform.workbench.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hotwj.platform.securityManagement.trainingParticipant.domain.HotTrainingParticipant;
import com.hotwj.platform.workbench.domain.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 政府端工作台Mapper接口
 *
 * @author shihongwei
 */
@Mapper
public interface GovWorkbenchMapper {

    /**
     * 统计当前辖区内的所有企业总数
     *
     * @param districtCode 区划代码
     * @return 企业总数
     */
    Long selectEnterpriseCount(@Param("districtCode") String districtCode);

    /**
     * 查询当前辖区内的所有企业列表
     *
     * @param districtCode 区划代码
     * @param companyName  企业名称 (可选)
     * @return 企业列表
     */
    List<GovHomeStatisticsVo.EnterpriseInfo> selectEnterpriseList(@Param("districtCode") String districtCode, @Param("companyName") String companyName);

    /**
     * 统计总运营车辆总数
     *
     * @param districtCode 区划代码
     * @return 运营车辆总数
     */
    Long selectVehicleCount(@Param("districtCode") String districtCode);

    /**
     * 统计当前总驾驶员总数
     *
     * @param districtCode 区划代码
     * @return 驾驶员总数
     */
    Long selectDriverCount(@Param("districtCode") String districtCode);

    // ================= 企业隐患 =================

    /**
     * 统计营业执照隐患数 (过期或未填写期限)
     */
    Long countBusinessLicense(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询营业执照隐患列表
     */
    Page<GovHiddenDangerDetailVo> listBusinessLicense(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计道路经营许可证隐患数 (过期或未填写期限)
     */
    Long countRoadPermit(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询道路经营许可证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listRoadPermit(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计上岗资格证隐患数 (在职管理人员过期或未填写)
     */
    Long countManagerQualification(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询上岗资格证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listManagerQualification(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    // ================= 车辆隐患 =================

    /**
     * 统计行驶证隐患数 (过期、未填写日期、强制报废)
     */
    Long countVehicleLicense(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询行驶证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listVehicleLicense(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计运输证隐患数 (过期或未填写)
     */
    Long countVehicleTransportPermit(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询运输证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listVehicleTransportPermit(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 获取指定企业用于风险计算的车辆列表
     */
    List<VehicleRiskCalcVo> selectVehicleForRiskCalc(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询指定时间范围内的培训参与记录
     */
    List<HotTrainingParticipant> selectTrainingParticipants(@Param("districtCode") String districtCode, @Param("endDate") String endDate);

    // ================= 事故统计 =================

    /**
     * 统计事故等级分布
     */
    List<GovAccidentStatsVo> selectAccidentLevelStats(@Param("districtCode") String districtCode);

    // ================= 驾驶员隐患 =================

    /**
     * 统计驾驶员身份证隐患数
     */
    Long countDriverIdCard(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询驾驶员身份证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listDriverIdCard(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计驾驶员驾驶证隐患数
     */
    Long countDriverLicense(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询驾驶员驾驶证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listDriverLicense(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计驾驶员从业资格证隐患数
     */
    Long countDriverQualification(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询驾驶员从业资格证隐患列表
     */
    Page<GovHiddenDangerDetailVo> listDriverQualification(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计驾驶员未参加岗前培训隐患数
     */
    Long countDriverPreJobTraining(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询驾驶员未参加岗前培训隐患列表
     */
    Page<GovHiddenDangerDetailVo> listDriverPreJobTraining(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 统计驾驶员违法违规隐患数 (未处理的违章)
     */
    Long countDriverViolation(@Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 查询驾驶员违法违规隐患列表
     */
    Page<GovHiddenDangerDetailVo> listDriverViolation(Page<GovHiddenDangerDetailVo> page, @Param("districtCode") String districtCode, @Param("companyId") Long companyId);

    /**
     * 按日统计隐患数量
     *
     * @param districtCode 区划代码
     * @param companyId    公司ID (可选)
     * @param startDate    开始日期 (可选)
     * @param endDate      结束日期 (可选)
     * @return 统计结果列表
     */
    List<HiddenDangerCountVo> selectHiddenDangerCountByDate(@Param("districtCode") String districtCode,
                                                            @Param("companyId") Long companyId,
                                                            @Param("startDate") String startDate,
                                                            @Param("endDate") String endDate);

    /**
     * 查询简单类型的隐患数量，按企业和分类分组
     *
     * @param districtCode 辖区编码 (可选，null查询所有)
     * @return 统计结果列表
     */
    List<CompanyRiskCountVo> selectSimpleRiskCountsGroupedByCompany(@Param("districtCode") String districtCode);

    /**
     * 查询企业行政区划代码
     * @param companyIds 企业ID集合
     * @return 企业区划信息
     */
    List<CompanyRiskCountVo> selectCompanyRegionCodes(@Param("companyIds") java.util.Collection<Long> companyIds);
}
