package com.zsElectric.boot.thirdParty.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsElectric.boot.common.util.AESCryptoUtils;
import com.zsElectric.boot.common.util.HmacMD5Util;
import com.zsElectric.boot.thirdParty.model.RechargeLevelPageRequestData;
import com.zsElectric.boot.thirdParty.model.ThirdPartyRequest;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 模拟调用 queryRechargeLevelPage 方法的 main 测试类
 * 用于构建并打印完整的请求参数，可复制到接口测试工具（如Postman）中测试
 *
 * @author wzq
 */
public class QueryRechargeLevelPageMain {

    // ===== 配置参数（需根据数据库中的第三方配置信息修改） =====
    // 运营商ID
    private static final String OPERATOR_ID = "12345qwer";
    // 运营商密钥
    private static final String OPERATOR_SECRET = "vfkh4k740lfg88kq";
    // 数据密钥（16位）
    private static final String DATA_SECRET = "bbkwy062pzyjhqmg";
    // 数据密钥IV（16位）
    private static final String DATA_SECRET_IV = "xgbzfgwz6ki2gm5j";
    // 签名密钥
    private static final String SIG_SECRET = "8h9sf4zd5cbtlu8x";

    // ===== Token配置（需要先调用queryToken获取） =====
    // 访问Token（从queryToken接口获取，格式可以是 "Bearer xxx" 或直接 "xxx"）
    private static final String ACCESS_TOKEN = "Bearer 045b862a1c7f4867aeea48568fdf1fc686c5b6d10c7a4922a779fe9321a64ac7";

    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) {
        try {
            System.out.println("========== 模拟 queryRechargeLevelPage 请求构建 ==========\n");

            // 1. 构建业务数据（分页查询参数）
            RechargeLevelPageRequestData pageRequestData = new RechargeLevelPageRequestData();
            pageRequestData.setPageNum(1);      // 第1页
            pageRequestData.setPageSize(10);    // 每页10条

            String jsonData = objectMapper.writeValueAsString(pageRequestData);
            System.out.println("1. 业务数据（明文JSON）:");
            System.out.println("   " + jsonData);

            // 2. AES加密业务数据
            String encryptedData = AESCryptoUtils.encrypt(jsonData, DATA_SECRET, DATA_SECRET_IV);
            System.out.println("\n2. 加密后的data:");
            System.out.println("   " + encryptedData);

            // 3. 生成时间戳（格式：yyyyMMddHHmmss）
            String timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
            System.out.println("\n3. 时间戳（timeStamp）:");
            System.out.println("   " + timeStamp);

            // 4. 序列号（4位）
            String seq = "0001";
            System.out.println("\n4. 序列号（seq）:");
            System.out.println("   " + seq);

            // 5. 生成签名
            // 签名内容拼接顺序: operatorId + data + timeStamp + seq
            String signContent = OPERATOR_ID + encryptedData + timeStamp + seq;
            String sig = HmacMD5Util.hmacMD5Hex(signContent, SIG_SECRET);
            System.out.println("\n5. 签名内容（signContent）:");
            System.out.println("   " + signContent);
            System.out.println("\n6. 签名结果（sig）:");
            System.out.println("   " + sig);

            // 6. 构建完整请求对象
            ThirdPartyRequest request = new ThirdPartyRequest();
            request.setOperatorId(OPERATOR_ID);
            request.setData(encryptedData);
            request.setTimeStamp(timeStamp);
            request.setSeq(seq);
            request.setSig(sig);

            String requestJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(request);
            System.out.println("\n========== 完整请求JSON ==========");
            System.out.println(requestJson);

            // 7. 打印Authorization Header
            System.out.println("\n========== Authorization Header ==========");
            System.out.println("Authorization: " + ACCESS_TOKEN);
            System.out.println("\n注意：ACCESS_TOKEN需要先调用queryToken接口获取，然后替换上面的值！");

            // 打印cURL命令（方便复制测试）
            System.out.println("\n========== cURL命令（POST请求） ==========");
            String compactJson = objectMapper.writeValueAsString(request);
            System.out.println("curl -X POST http://localhost:8080/thirdParty/query_recharge_level_page \\");
            System.out.println("  -H \"Content-Type: application/json\" \\");
            System.out.println("  -H \"Authorization: " + ACCESS_TOKEN + "\" \\");
            System.out.println("  -d '" + compactJson + "'");

            System.out.println("\n========== 测试完成 ==========");

        } catch (Exception e) {
            System.err.println("构建请求失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
