package com.ruoyi.notification.service;

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

import com.ruoyi.notification.domain.NotificationMessage;
import com.ruoyi.notification.domain.NotificationTemplate;

/**
 * 通知服务接口
 * 
 * @author ruoyi
 * @date 2025-12-19
 */
public interface INotificationService 
{
    /**
     * 发送单个通知消息
     * 
     * @param message 通知消息
     * @return 发送结果
     */
    boolean sendNotification(NotificationMessage message);

    /**
     * 批量发送通知消息
     * 
     * @param messages 通知消息列表
     * @return 发送结果统计
     */
    Map<String, Object> sendBatchNotifications(List<NotificationMessage> messages);

    /**
     * 使用模板发送通知
     * 
     * @param templateCode 模板编码
     * @param recipientType 接收者类型
     * @param recipientId 接收者ID
     * @param recipientAddress 接收地址
     * @param channel 通知渠道
     * @param parameters 模板参数
     * @param businessType 业务类型
     * @param businessId 业务ID
     * @return 发送结果
     */
    boolean sendTemplateNotification(String templateCode, String recipientType, 
                                   String recipientId, String recipientAddress, 
                                   String channel, Map<String, Object> parameters,
                                   String businessType, String businessId);

    /**
     * 发送付款提醒通知
     * 
     * @param contractId 合同ID
     * @param recipientId 接收者ID
     * @param recipientAddress 接收地址
     * @param channel 通知渠道
     * @param dueDate 到期日期
     * @param amount 金额
     * @return 发送结果
     */
    boolean sendPaymentReminder(Long contractId, String recipientId, 
                              String recipientAddress, String channel,
                              String dueDate, String amount);

    /**
     * 发送合同状态变更通知
     * 
     * @param contractId 合同ID
     * @param recipientId 接收者ID
     * @param recipientAddress 接收地址
     * @param channel 通知渠道
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @return 发送结果
     */
    boolean sendContractStatusNotification(Long contractId, String recipientId,
                                         String recipientAddress, String channel,
                                         String oldStatus, String newStatus);

    /**
     * 发送系统异常告警
     * 
     * @param alertType 告警类型
     * @param alertLevel 告警级别
     * @param alertMessage 告警消息
     * @param businessType 业务类型
     * @param businessId 业务ID
     * @return 发送结果
     */
    boolean sendSystemAlert(String alertType, String alertLevel, 
                          String alertMessage, String businessType, String businessId);

    /**
     * 重试失败的通知
     * 
     * @param notificationId 通知ID
     * @return 重试结果
     */
    boolean retryFailedNotification(String notificationId);

    /**
     * 获取通知发送状态
     * 
     * @param notificationId 通知ID
     * @return 发送状态信息
     */
    Map<String, Object> getNotificationStatus(String notificationId);

    /**
     * 获取通知发送历史
     * 
     * @param businessType 业务类型
     * @param businessId 业务ID
     * @return 发送历史列表
     */
    List<NotificationMessage> getNotificationHistory(String businessType, String businessId);

    /**
     * 验证通知渠道可用性
     * 
     * @param channel 通知渠道
     * @param recipientAddress 接收地址
     * @return 验证结果
     */
    boolean validateNotificationChannel(String channel, String recipientAddress);

    /**
     * 获取支持的通知渠道列表
     * 
     * @return 渠道列表
     */
    List<String> getSupportedChannels();

    /**
     * 创建通知模板
     * 
     * @param template 模板信息
     * @return 创建结果
     */
    boolean createNotificationTemplate(NotificationTemplate template);

    /**
     * 更新通知模板
     * 
     * @param template 模板信息
     * @return 更新结果
     */
    boolean updateNotificationTemplate(NotificationTemplate template);

    /**
     * 根据模板编码获取模板
     * 
     * @param templateCode 模板编码
     * @return 模板信息
     */
    NotificationTemplate getTemplateByCode(String templateCode);

    /**
     * 获取通知统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    Map<String, Object> getNotificationStatistics(String startDate, String endDate);
}