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

import com.qqchen.deploy.backend.notification.dto.wework.WeworkWebhookRequest;
import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum;
import com.qqchen.deploy.backend.notification.enums.WeworkMessageTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 企业微信发送通知请求
 *
 * @author qqchen
 * @since 2025-11-12
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class WeworkSendNotificationRequest extends BaseSendNotificationRequest {

    /**
     * 渠道类型（用于Jackson反序列化）
     */
    private final NotificationChannelTypeEnum channelType = NotificationChannelTypeEnum.WEWORK;

    /**
     * 消息类型（必填）
     * - TEXT: 普通文本消息
     * - MARKDOWN: Markdown格式消息
     * - FILE: 文件消息
     */
    private WeworkMessageTypeEnum messageType = WeworkMessageTypeEnum.TEXT;

    /**
     * @的手机号列表（可选） 例如：["13800138000", "13900139000"]
     */
    private List<String> mentionedMobileList;

    /**
     * @的用户ID列表（可选） 例如：["@all"] 表示@所有人，或具体的userid
     */
    private List<String> mentionedUserList;

    /**
     * 文件路径（仅当messageType为FILE时使用）
     * 服务器本地文件路径，用于文件上传
     */
    private String filePath;

    /**
     * 文件名称（仅当messageType为FILE时使用）
     * 显示给用户的文件名
     */
    private String fileName;

    @Override
    public NotificationChannelTypeEnum getChannelType() {
        return NotificationChannelTypeEnum.WEWORK;
    }

    /**
     * 转换为企微 Webhook API 请求格式
     *
     * @return 企微API标准格式的请求对象
     * @throws UnsupportedOperationException 当消息类型为FILE时抛出，需使用 toWebhookRequest(String mediaId)
     */
    public WeworkWebhookRequest toWebhookRequest() {
        return switch (messageType) {
            case TEXT -> buildTextRequest();
            case MARKDOWN -> buildMarkdownRequest();
            case FILE -> throw new UnsupportedOperationException(
                "文件消息需要先上传获取media_id，请使用 toWebhookRequest(String mediaId)");
        };
    }

    /**
     * 转换为文件消息格式（需要提供已上传的media_id）
     *
     * @param mediaId 企业微信文件上传后返回的media_id
     * @return 企微API标准格式的请求对象
     * @throws IllegalStateException 当消息类型不是FILE时抛出
     */
    public WeworkWebhookRequest toWebhookRequest(String mediaId) {
        if (messageType != WeworkMessageTypeEnum.FILE) {
            throw new IllegalStateException("只有FILE类型消息才能使用此方法");
        }
        return buildFileRequest(mediaId);
    }

    /**
     * 构建文本消息请求
     */
    private WeworkWebhookRequest buildTextRequest() {
        return WeworkWebhookRequest.builder()
            .msgtype(WeworkMessageTypeEnum.TEXT.getApiType())
            .text(WeworkWebhookRequest.TextContent.builder()
                .content(getContent())
                .mentionedList(mentionedUserList)
                .mentionedMobileList(mentionedMobileList)
                .build())
            .build();
    }

    /**
     * 构建Markdown消息请求
     */
    private WeworkWebhookRequest buildMarkdownRequest() {
        return WeworkWebhookRequest.builder()
            .msgtype(WeworkMessageTypeEnum.MARKDOWN.getApiType())
            .markdown(WeworkWebhookRequest.MarkdownContent.builder()
                .content(getContent())
                .build())
            .build();
    }

    /**
     * 构建文件消息请求
     */
    private WeworkWebhookRequest buildFileRequest(String mediaId) {
        return WeworkWebhookRequest.builder()
            .msgtype(WeworkMessageTypeEnum.FILE.getApiType())
            .file(WeworkWebhookRequest.FileContent.builder()
                .mediaId(mediaId)
                .build())
            .build();
    }
}
