package com.qqchen.deploy.backend.notification.adapter;

import com.qqchen.deploy.backend.notification.entity.config.BaseNotificationConfig;
import com.qqchen.deploy.backend.notification.dto.BaseSendNotificationRequest;
import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum;

/**
 * 通知渠道适配器接口
 * 使用泛型约束配置类型和请求类型，避免类型转换
 *
 * @param <C> 配置类型，必须继承 BaseNotificationConfig
 * @param <R> 请求类型，必须继承 BaseSendNotificationRequest
 * @author qqchen
 * @since 2025-11-03
 */
public interface INotificationChannelAdapter<C extends BaseNotificationConfig, R extends BaseSendNotificationRequest> {
    
    /**
     * 发送通知
     *
     * @param config  渠道配置
     * @param request 发送通知请求
     * @throws Exception 发送失败时抛出异常
     */
    void send(C config, R request) throws Exception;
    
    /**
     * 发送文件（可选，不是所有渠道都支持）
     *
     * @param config   渠道配置
     * @param filePath 文件路径
     * @param fileName 文件名称
     * @throws Exception 发送失败时抛出异常
     */
    default void sendFile(C config, String filePath, String fileName) throws Exception {
        throw new UnsupportedOperationException("该渠道不支持发送文件");
    }
    
    /**
     * 支持的渠道类型
     *
     * @return 渠道类型枚举
     */
    NotificationChannelTypeEnum supportedType();
    
    /**
     * 校验配置是否有效（可选实现）
     *
     * @param config 渠道配置
     * @return 校验结果消息
     */
    default String validateConfig(C config) {
        return "配置有效";
    }
    
    /**
     * 测试连接
     * 发送一条测试消息或测试连接是否正常
     *
     * @param config 渠道配置
     * @throws Exception 测试失败时抛出异常
     */
    void testConnection(C config) throws Exception;
}

