package com.njcn.msgpush.module.push.client.sender;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 统一发送结果。
 * outcome 负责主流程分支判断；
 * errorCode/message 负责平台内部归类和中文展示；
 * retryable 负责决定是否进入重试队列。
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SendResult {

    /**
     * 结果分类，供主流程分支判断使用。
     */
    private SendOutcome outcome;

    /**
     * 平台统一错误码。
     */
    private String errorCode;

    /**
     * 中文错误说明。
     */
    private String message;

    /**
     * 服务商原始错误码。
     */
    private String providerRawCode;

    /**
     * 是否允许进入重试队列。
     */
    private boolean retryable;

    /**
     * 第三方消息 ID。
     */
    private String thirdPartyId;

    /**
     * 发送时间。
     */
    private LocalDateTime sendTime;

    /**
     * 耗时，单位毫秒。
     */
    private Integer costTime;

    /**
     * 第三方已明确返回成功。
     */
    public static SendResult success(LocalDateTime sendTime, Integer costTime, String thirdPartyId) {
        return SendResult.builder()
                .outcome(SendOutcome.SUCCESS)
                .sendTime(sendTime)
                .costTime(costTime)
                .thirdPartyId(thirdPartyId)
                .build();
    }

    /**
     * 第三方已受理，请等待异步回执或延迟查询更新最终状态。
     */
    public static SendResult accepted(LocalDateTime sendTime, Integer costTime, String thirdPartyId) {
        return SendResult.builder()
                .outcome(SendOutcome.ACCEPTED)
                .sendTime(sendTime)
                .costTime(costTime)
                .thirdPartyId(thirdPartyId)
                .build();
    }

    /**
     * 服务商不支持该渠道能力。
     */
    public static SendResult unsupported(String message) {
        return SendResult.builder()
                .outcome(SendOutcome.UNSUPPORTED_CHANNEL)
                .errorCode("UNSUPPORTED_CHANNEL")
                .message(message)
                .retryable(false)
                .build();
    }

    /**
     * 服务商理论支持该能力，但当前配置不完整或初始化失败。
     */
    public static SendResult configInvalid(String message) {
        return SendResult.builder()
                .outcome(SendOutcome.CONFIG_INVALID)
                .errorCode("CONFIG_INVALID")
                .message(message)
                .retryable(false)
                .build();
    }
}
