package com.aegis.notification.service;

import com.aegis.notification.domain.Notification;
import com.aegis.notification.domain.NotificationTemplate;
import java.util.List;
import java.util.Map;

/**
 * 统一通知服务接口
 * 
 * @author aegis
 */
public interface INotificationService {
    
    /**
     * 发送通知（单个接收者）
     * 
     * @param receiverId 接收者用户ID
     * @param title 通知标题
     * @param content 通知内容
     * @param channel 通知渠道（station/sms/email）
     * @param businessType 业务类型（可选）
     * @param businessId 业务ID（可选）
     * @return 通知ID
     */
    Long sendNotification(Long receiverId, String title, String content, 
                         String channel, String businessType, Long businessId);
    
    /**
     * 发送通知（批量接收者）
     * 
     * @param receiverIds 接收者用户ID列表
     * @param title 通知标题
     * @param content 通知内容
     * @param channel 通知渠道
     * @param businessType 业务类型（可选）
     * @param businessId 业务ID（可选）
     * @return 通知ID列表
     */
    List<Long> sendBatchNotification(List<Long> receiverIds, String title, 
                                     String content, String channel, 
                                     String businessType, Long businessId);
    
    /**
     * 使用模板发送通知
     * 
     * @param receiverId 接收者用户ID
     * @param templateCode 模板编码
     * @param variables 模板变量（Map）
     * @param channel 通知渠道（可选，默认使用模板配置的渠道）
     * @param businessType 业务类型（可选）
     * @param businessId 业务ID（可选）
     * @return 通知ID
     */
    Long sendNotificationByTemplate(Long receiverId, String templateCode, 
                                   Map<String, Object> variables, 
                                   String channel, String businessType, Long businessId);
    
    /**
     * 查询用户通知列表
     * 
     * @param receiverId 接收者用户ID
     * @param status 通知状态（可选）
     * @param channel 通知渠道（可选）
     * @return 通知列表
     */
    List<Notification> selectNotificationList(Long receiverId, String status, String channel);
    
    /**
     * 根据ID查询通知详情
     * 
     * @param notificationId 通知ID
     * @param receiverId 接收者用户ID（用于权限校验）
     * @return 通知对象
     */
    Notification selectNotificationById(Long notificationId, Long receiverId);
    
    /**
     * 查询未读通知数量
     * 
     * @param receiverId 接收者用户ID
     * @return 未读数量
     */
    int countUnreadNotifications(Long receiverId);
    
    /**
     * 标记通知为已读
     * 
     * @param notificationId 通知ID
     * @param receiverId 接收者用户ID（用于权限校验）
     * @return 结果
     */
    int markAsRead(Long notificationId, Long receiverId);
    
    /**
     * 批量标记为已读
     * 
     * @param notificationIds 通知ID列表
     * @param receiverId 接收者用户ID
     * @return 结果
     */
    int markBatchAsRead(Long[] notificationIds, Long receiverId);
    
    /**
     * 标记全部为已读
     * 
     * @param receiverId 接收者用户ID
     * @return 结果
     */
    int markAllAsRead(Long receiverId);
    
    /**
     * 删除通知
     * 
     * @param notificationId 通知ID
     * @param receiverId 接收者用户ID（用于权限校验）
     * @return 结果
     */
    int deleteNotification(Long notificationId, Long receiverId);
    
    /**
     * 批量删除通知
     * 
     * @param notificationIds 通知ID列表
     * @param receiverId 接收者用户ID（用于权限校验）
     * @return 结果
     */
    int deleteBatchNotification(Long[] notificationIds, Long receiverId);
    
    // ========== 模板管理方法 ==========
    
    /**
     * 查询通知模板列表
     * 
     * @param template 查询条件
     * @return 模板列表
     */
    List<NotificationTemplate> selectTemplateList(NotificationTemplate template);
    
    /**
     * 根据ID查询通知模板
     * 
     * @param templateId 模板ID
     * @return 模板对象
     */
    NotificationTemplate selectTemplateById(Long templateId);
    
    /**
     * 根据编码查询通知模板
     * 
     * @param templateCode 模板编码
     * @return 模板对象
     */
    NotificationTemplate selectTemplateByCode(String templateCode);
    
    /**
     * 新增通知模板
     * 
     * @param template 模板对象
     * @return 结果
     */
    int insertTemplate(NotificationTemplate template);
    
    /**
     * 修改通知模板
     * 
     * @param template 模板对象
     * @return 结果
     */
    int updateTemplate(NotificationTemplate template);
    
    /**
     * 删除通知模板
     * 
     * @param templateIds 模板ID列表
     * @return 结果
     */
    int deleteTemplateByIds(Long[] templateIds);
}