package com.qqchen.deploy.backend.notification.entity.config;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum;
import lombok.Data;

/**
 * 通知渠道配置基类
 * 
 * <p><b>DDD 定位：Value Object（值对象）</b></p>
 * 
 * <h3>设计说明：</h3>
 * <ul>
 *   <li>作为值对象，可跨层使用（Domain Layer ↔ API Layer）</li>
 *   <li>通过 Jackson 注解支持多态反序列化（基于 channelType 字段）</li>
 *   <li>以 JSON 格式存储在 NotificationChannel.config 字段中</li>
 *   <li>不同渠道有不同的配置子类（EmailNotificationConfig、WeworkNotificationConfig）</li>
 * </ul>
 * 
 * <h3>为何不需要单独的 DTO（务实的 DDD）：</h3>
 * <ol>
 *   <li>字段验证规则相同（创建和查询）</li>
 *   <li>无复杂的转换逻辑，仅简单字段映射</li>
 *   <li>相对稳定，不频繁变化</li>
 *   <li>避免重复定义字段，减少维护成本</li>
 * </ol>
 * 
 * <h3>未来如需引入 DTO 的场景：</h3>
 * <ul>
 *   <li>不同场景需要不同的验证规则（如创建时必填，更新时可选）</li>
 *   <li>需要敏感字段脱敏处理（如密码字段返回时隐藏）</li>
 *   <li>需要复杂的字段转换逻辑</li>
 *   <li>Config 频繁变化，影响 API 稳定性</li>
 * </ul>
 * 
 * @author qqchen
 * @since 2025-11-12
 */
@Data
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "channelType"
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = WeworkNotificationConfig.class, name = "WEWORK"),
    @JsonSubTypes.Type(value = EmailNotificationConfig.class, name = "EMAIL")
})
public abstract class BaseNotificationConfig {
    
    /**
     * 获取渠道类型
     */
    public abstract NotificationChannelTypeEnum getChannelType();
}
