package com.ruoyi.ccdi.project.service;

import com.ruoyi.ccdi.project.domain.dto.CcdiProjectAbnormalAccountQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExternalPersonQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExternalRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskExclusionSaveDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectUnsubmittedAccountQueryDTO;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectAbnormalAccountExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectEmployeeCreditNegativeExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectExternalPersonWarningExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectRiskModelPeopleExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectRiskPeopleOverviewExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectUnsubmittedAccountFlowExcel;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectAbnormalAccountPageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalRiskSummaryVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalPersonWarningVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardsVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionPageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectUnsubmittedAccountFlowVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectUnsubmittedAccountVO;
import jakarta.servlet.http.HttpServletResponse;

import java.util.List;

/**
 * 结果总览服务接口
 */
public interface ICcdiProjectOverviewService {

    /**
     * 查询风险仪表盘
     *
     * @param projectId 项目ID
     * @return 风险仪表盘
     */
    CcdiProjectOverviewDashboardVO getDashboard(Long projectId);

    /**
     * 排除单条可疑预警
     *
     * @param dto 排除参数
     */
    void excludeRisk(CcdiProjectRiskExclusionSaveDTO dto);

    /**
     * 查询风险人员总览
     *
     * @param queryDTO 查询条件
     * @return 风险人员总览
     */
    CcdiProjectRiskPeopleOverviewVO getRiskPeopleOverview(CcdiProjectRiskPeopleQueryDTO queryDTO);

    /**
     * 查询中高风险人员TOP10
     *
     * @param projectId 项目ID
     * @return 中高风险人员TOP10
     */
    CcdiProjectTopRiskPeopleVO getTopRiskPeople(Long projectId);

    /**
     * 查询项目分析详情
     *
     * @param queryDTO 查询条件
     * @return 项目分析详情
     */
    default CcdiProjectPersonAnalysisDetailVO getPersonAnalysisDetail(CcdiProjectPersonAnalysisDetailQueryDTO queryDTO) {
        return new CcdiProjectPersonAnalysisDetailVO();
    }

    /**
     * 查询风险模型卡片
     *
     * @param projectId 项目ID
     * @return 风险模型卡片
     */
    default CcdiProjectRiskModelCardsVO getRiskModelCards(Long projectId) {
        return new CcdiProjectRiskModelCardsVO();
    }

    /**
     * 查询风险模型命中人员
     *
     * @param queryDTO 查询条件
     * @return 风险模型命中人员
     */
    default CcdiProjectRiskModelPeopleVO getRiskModelPeople(CcdiProjectRiskModelPeopleQueryDTO queryDTO) {
        return new CcdiProjectRiskModelPeopleVO();
    }

    /**
     * 导出风险模型命中人员
     *
     * @param queryDTO 查询条件
     * @return 导出列表
     */
    default List<CcdiProjectRiskModelPeopleExcel> exportRiskModelPeople(CcdiProjectRiskModelPeopleQueryDTO queryDTO) {
        return List.of();
    }

    /**
     * 查询外部人员预警
     *
     * @param queryDTO 查询条件
     * @return 外部人员预警
     */
    default CcdiProjectExternalPersonWarningVO getExternalPersonWarnings(CcdiProjectExternalPersonQueryDTO queryDTO) {
        return new CcdiProjectExternalPersonWarningVO();
    }

    /**
     * 查询外部人员风险等级汇总
     *
     * @param projectId 项目ID
     * @return 外部人员风险等级汇总
     */
    default CcdiProjectExternalRiskSummaryVO getExternalRiskSummary(Long projectId) {
        return new CcdiProjectExternalRiskSummaryVO();
    }

    /**
     * 导出外部人员预警
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    default List<CcdiProjectExternalPersonWarningExcel> exportExternalPersonWarnings(Long projectId) {
        return List.of();
    }

    /**
     * 查询外部人员风险模型卡片
     *
     * @param projectId 项目ID
     * @return 风险模型卡片
     */
    default CcdiProjectRiskModelCardsVO getExternalRiskModelCards(Long projectId) {
        return new CcdiProjectRiskModelCardsVO();
    }

    /**
     * 查询外部人员风险模型命中人员
     *
     * @param queryDTO 查询条件
     * @return 命中人员
     */
    default CcdiProjectRiskModelPeopleVO getExternalRiskModelPeople(
        CcdiProjectExternalRiskModelPeopleQueryDTO queryDTO
    ) {
        return new CcdiProjectRiskModelPeopleVO();
    }

    /**
     * 导出外部人员风险模型命中人员
     *
     * @param queryDTO 查询条件
     * @return 导出列表
     */
    default List<CcdiProjectRiskModelPeopleExcel> exportExternalRiskModelPeople(
        CcdiProjectExternalRiskModelPeopleQueryDTO queryDTO
    ) {
        return List.of();
    }

    /**
     * 查询涉疑交易明细
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    default CcdiProjectSuspiciousTransactionPageVO getSuspiciousTransactions(
        CcdiProjectSuspiciousTransactionQueryDTO queryDTO
    ) {
        return new CcdiProjectSuspiciousTransactionPageVO();
    }

    /**
     * 导出涉疑交易明细
     *
     * @param queryDTO 查询条件
     * @return 导出列表
     */
    default List<CcdiProjectSuspiciousTransactionExcel> exportSuspiciousTransactions(
        CcdiProjectSuspiciousTransactionQueryDTO queryDTO
    ) {
        return List.of();
    }

    /**
     * 导出风险人员总览
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    default List<CcdiProjectRiskPeopleOverviewExcel> exportRiskPeopleOverview(Long projectId) {
        return List.of();
    }

    /**
     * 统一导出风险明细
     *
     * @param response 响应流
     * @param projectId 项目ID
     */
    default void exportRiskDetails(HttpServletResponse response, Long projectId) {
    }

    /**
     * 按涉疑交易筛选范围统一导出风险明细
     *
     * @param response 响应流
     * @param queryDTO 涉疑交易筛选条件
     */
    default void exportRiskDetails(
        HttpServletResponse response,
        CcdiProjectSuspiciousTransactionQueryDTO queryDTO
    ) {
    }

    /**
     * 一键导出结果总览报告
     *
     * @param response 响应流
     * @param projectId 项目ID
     */
    default void exportOverviewReport(HttpServletResponse response, Long projectId) {
    }

    /**
     * 导出项目员工负面征信
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    default List<CcdiProjectEmployeeCreditNegativeExcel> exportEmployeeCreditNegative(Long projectId) {
        return List.of();
    }

    /**
     * 查询项目员工负面征信
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    default CcdiProjectEmployeeCreditNegativePageVO getEmployeeCreditNegative(
        CcdiProjectEmployeeCreditNegativeQueryDTO queryDTO
    ) {
        return new CcdiProjectEmployeeCreditNegativePageVO();
    }

    /**
     * 查询异常账户人员信息
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    default CcdiProjectAbnormalAccountPageVO getAbnormalAccountPeople(
        CcdiProjectAbnormalAccountQueryDTO queryDTO
    ) {
        return new CcdiProjectAbnormalAccountPageVO();
    }

    /**
     * 导出异常账户人员信息
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    default List<CcdiProjectAbnormalAccountExcel> exportAbnormalAccountPeople(Long projectId) {
        return List.of();
    }

    /**
     * 查询未提交账户
     *
     * @param queryDTO 查询条件
     * @return 未提交账户结果
     */
    default CcdiProjectUnsubmittedAccountVO getUnsubmittedAccounts(
        CcdiProjectUnsubmittedAccountQueryDTO queryDTO
    ) {
        return new CcdiProjectUnsubmittedAccountVO();
    }

    /**
     * 查询未提交账户流水
     *
     * @param queryDTO 查询条件
     * @return 未提交账户流水
     */
    default List<CcdiProjectUnsubmittedAccountFlowVO> getUnsubmittedAccountFlows(
        CcdiProjectUnsubmittedAccountQueryDTO queryDTO
    ) {
        return List.of();
    }

    /**
     * 导出未提交账户流水
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    default List<CcdiProjectUnsubmittedAccountFlowExcel> exportUnsubmittedAccountFlows(Long projectId) {
        return List.of();
    }

    /**
     * 导出未提交账户流水
     *
     * @param queryDTO 查询条件
     * @return 导出列表
     */
    default List<CcdiProjectUnsubmittedAccountFlowExcel> exportUnsubmittedAccountFlows(
        CcdiProjectUnsubmittedAccountQueryDTO queryDTO
    ) {
        return List.of();
    }

    /**
     * 重算结果总览员工结果并同步项目风险人数
     *
     * @param projectId 项目ID
     * @param operator 操作人
     */
    void refreshOverviewEmployeeResults(Long projectId, String operator);

    /**
     * 刷新项目风险人数
     *
     * @param projectId 项目ID
     * @param operator 操作人
     */
    void refreshProjectRiskCounts(Long projectId, String operator);
}
