package com.malk.server.aliwork;

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

/**
 * 宜搭请求鉴权上下文（原子接口参数容器）
 *
 * <p>新版 {@link com.malk.service.aliwork.YDClient_Form} / {@link com.malk.service.aliwork.YDClient_Process}
 * 原子接口统一用 YDAuth 作为第 1 参数，封装调用宜搭 API 所需的全部鉴权字段。</p>
 *
 * <p>使用说明：</p>
 * <ul>
 *   <li>{@code accessToken}：钉钉应用 access_token。若为 null，实现端将回退到全局
 *       {@code DDClient.initTokenHeader()}（用 application-*.yml 配置的 dingtalk.appKey/appSecret 取）。</li>
 *   <li>{@code appType} / {@code systemToken}：必填。宜搭应用标识与密钥。</li>
 *   <li>{@code userId}：可选，默认 {@link YDConf#PUB_ACCOUNT}。</li>
 * </ul>
 *
 * <p>单租户场景（mcli / shunfeng / guangming）可直接用 {@link #ofGlobal(YDConf)}
 * 快速构造；多租户场景（mjava-pro）按 tenantId 动态构造。</p>
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class YDAuth {

    /**
     * 钉钉应用 access_token。可为 null（实现端回退到 DDClient 全局 token）。
     */
    private String accessToken;

    /**
     * 宜搭应用编码，必填。
     */
    private String appType;

    /**
     * 宜搭应用密钥，必填。
     */
    private String systemToken;

    /**
     * 操作人 userId。为空时使用 {@link YDConf#PUB_ACCOUNT} 公共账号。
     */
    private String userId;

    /**
     * 基于全局 YDConf 构造（单租户场景便捷方法）
     */
    public static YDAuth ofGlobal(YDConf conf) {
        return YDAuth.builder()
                .appType(conf.getAppType())
                .systemToken(conf.getSystemToken())
                .userId(YDConf.PUB_ACCOUNT)
                .build();
    }

    /**
     * 获取 userId，null 时返回 PUB_ACCOUNT。
     */
    public String resolvedUserId() {
        return userId == null || userId.isEmpty() ? YDConf.PUB_ACCOUNT : userId;
    }
}
