package com.qdb.sdk;

import com.qdb.sdk.api.GoodsApi;
import com.qdb.sdk.api.OrderApi;
import com.qdb.sdk.api.PurchaseApi;
import com.qdb.sdk.api.ShopApi;
import com.qdb.sdk.util.HttpUtil;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * 企得宝ERP SDK 主客户端
 * <p>
 * 提供对企得宝ERP开放API的统一访问入口。
 * 通过此类获取各业务模块的 API 实例进行调用。
 * </p>
 *
 * <h3>使用示例：</h3>
 * <pre>{@code
 * // 创建配置
 * QdbConfig config = QdbConfig.builder()
 *     .clientId("your_client_id")
 *     .clientSecret("your_client_secret")
 *     .build();
 * config.validate();
 *
 * // 创建客户端
 * QdbClient client = new QdbClient(config);
 *
 * // 调用订单上传接口
 * OrderSaveRequest request = OrderSaveRequest.builder()
 *     .shopId(9900100000000136L)
 *     .tradeNo("T202401240001")
 *     // ... 设置其他参数
 *     .build();
 *
 * QdbResponse<Void> response = client.getOrderApi().saveOrder(request);
 * if (response.isSuccess()) {
 *     System.out.println("订单上传成功");
 * }
 *
 * // 使用完毕后关闭
 * client.shutdown();
 * }</pre>
 *
 * @author qdb-sdk
 * @version 1.0.0
 */
@Slf4j
@Getter
public class QdbClient {

    /**
     * SDK 配置信息
     */
    private final QdbConfig config;

    /**
     * HTTP 工具类
     */
    private final HttpUtil httpUtil;

    // ====== 业务 API 实例 ======

    /** 订单管理 API */
    private final OrderApi orderApi;

    /** 采购管理 API */
    private final PurchaseApi purchaseApi;

    /** 商品管理 API */
    private final GoodsApi goodsApi;

    /** 基础资料 - 店铺管理 API */
    private final ShopApi shopApi;

    /**
     * 构造方法
     *
     * @param config SDK 配置信息
     */
    public QdbClient(QdbConfig config) {
        // 校验配置
        config.validate();

        this.config = config;
        this.httpUtil = new HttpUtil(config);

        // 初始化各业务 API 模块
        this.orderApi = new OrderApi(this);
        this.purchaseApi = new PurchaseApi(this);
        this.goodsApi = new GoodsApi(this);
        this.shopApi = new ShopApi(this);

        log.info("企得宝ERP SDK 初始化成功, clientId: {}", config.getClientId());
    }

    /**
     * 关闭客户端，释放资源
     */
    public void shutdown() {
        if (httpUtil != null) {
            httpUtil.close();
        }
        log.info("企得宝ERP SDK 已关闭");
    }
}
