package com.ruoyi.analytics.service;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 数据查询和展示服务接口
 * 
 * 实现债权状态查询、历史记录查看、实时数据更新和用户个性化仪表板
 * 
 * @author ruoyi
 * @date 2025-12-19
 */
public interface IDataQueryService
{
    /**
     * 查询债权状态
     * 
     * @param creditId 债权ID
     * @return 债权状态信息
     */
    Map<String, Object> queryCreditStatus(Long creditId);

    /**
     * 批量查询债权状态
     * 
     * @param creditIds 债权ID列表
     * @return 债权状态信息列表
     */
    List<Map<String, Object>> batchQueryCreditStatus(List<Long> creditIds);

    /**
     * 查询债权历史记录
     * 
     * @param creditId 债权ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 历史记录列表
     */
    List<Map<String, Object>> queryCreditHistory(Long creditId, Date startDate, Date endDate);

    /**
     * 查询合同状态
     * 
     * @param contractId 合同ID
     * @return 合同状态信息
     */
    Map<String, Object> queryContractStatus(Long contractId);

    /**
     * 查询融资申请状态
     * 
     * @param applicationId 申请ID
     * @return 融资申请状态信息
     */
    Map<String, Object> queryFinancingApplicationStatus(Long applicationId);

    /**
     * 实时查询债权流转状态
     * 
     * @param creditId 债权ID
     * @return 实时流转状态
     */
    Map<String, Object> queryRealTimeCreditFlow(Long creditId);

    /**
     * 查询用户相关的所有债权
     * 
     * @param userId 用户ID
     * @param status 状态过滤
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 债权列表
     */
    Map<String, Object> queryUserCredits(Long userId, String status, Integer pageNum, Integer pageSize);

    /**
     * 查询公司相关的债权统计
     * 
     * @param companyId 公司ID
     * @param companyType 公司类型 (security/client)
     * @return 债权统计信息
     */
    Map<String, Object> queryCompanyCreditStatistics(Long companyId, String companyType);

    /**
     * 查询资金流转记录
     * 
     * @param accountId 账户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 资金流转记录
     */
    List<Map<String, Object>> queryFundTransferRecords(Long accountId, Date startDate, Date endDate);

    /**
     * 查询系统概览数据
     * 
     * @param userId 用户ID
     * @return 系统概览数据
     */
    Map<String, Object> querySystemOverview(Long userId);

    /**
     * 搜索债权信息
     * 
     * @param keyword 关键词
     * @param searchType 搜索类型 (creditNumber/contractNumber/companyName)
     * @param filters 过滤条件
     * @return 搜索结果
     */
    List<Map<String, Object>> searchCredits(String keyword, String searchType, Map<String, Object> filters);

    /**
     * 获取实时通知数据
     * 
     * @param userId 用户ID
     * @param notificationType 通知类型
     * @return 通知数据
     */
    List<Map<String, Object>> getRealTimeNotifications(Long userId, String notificationType);

    /**
     * 订阅实时数据更新
     * 
     * @param userId 用户ID
     * @param dataType 数据类型
     * @param callback 回调函数
     * @return 订阅ID
     */
    String subscribeRealTimeUpdates(Long userId, String dataType, String callback);

    /**
     * 取消实时数据订阅
     * 
     * @param subscriptionId 订阅ID
     * @return 取消结果
     */
    boolean unsubscribeRealTimeUpdates(String subscriptionId);

    /**
     * 获取个性化仪表板配置
     * 
     * @param userId 用户ID
     * @return 仪表板配置
     */
    Map<String, Object> getPersonalizedDashboard(Long userId);

    /**
     * 保存个性化仪表板配置
     * 
     * @param userId 用户ID
     * @param dashboardConfig 仪表板配置
     * @return 保存结果
     */
    boolean savePersonalizedDashboard(Long userId, Map<String, Object> dashboardConfig);

    /**
     * 查询数据变更日志
     * 
     * @param entityType 实体类型
     * @param entityId 实体ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 变更日志
     */
    List<Map<String, Object>> queryDataChangeLog(String entityType, Long entityId, Date startDate, Date endDate);

    /**
     * 获取数据统计摘要
     * 
     * @param statisticsType 统计类型
     * @param timeRange 时间范围
     * @return 统计摘要
     */
    Map<String, Object> getDataStatisticsSummary(String statisticsType, String timeRange);

    /**
     * 查询预警信息
     * 
     * @param userId 用户ID
     * @param alertType 预警类型
     * @param severity 严重程度
     * @return 预警信息列表
     */
    List<Map<String, Object>> queryAlerts(Long userId, String alertType, String severity);

    /**
     * 标记预警为已读
     * 
     * @param alertId 预警ID
     * @param userId 用户ID
     * @return 标记结果
     */
    boolean markAlertAsRead(Long alertId, Long userId);
}