package com.table.transfer.util.tron;

import cn.hutool.core.codec.Base58;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.digest.DigestUtil;

import java.util.Arrays;

/**
 * TRON 地址转换工具（纯 Hutool 版本）
 */
public class TronHexAndBase58Util {
    
    /**
     * Hex 地址转 Base58 地址
     */
    public static String hexToBase58(String hexAddress) {
        try {
            // 移除可能存在的 0x 前缀
            if (hexAddress.startsWith("0x")) {
                hexAddress = hexAddress.substring(2);
            }
            
            if (hexAddress.length() != 40) {
                throw new IllegalArgumentException("无效的地址长度: " + hexAddress.length());
            }
            
            // 添加 TRON 地址前缀 0x41
            String fullHex = "41" + hexAddress;
            
            // 使用 Hutool 将 Hex 转换为字节数组
            byte[] addressBytes = HexUtil.decodeHex(fullHex);
            
            // 计算校验和
            byte[] checksum = calculateChecksum(addressBytes);
            
            // 组合地址字节和校验和
            byte[] fullBytes = new byte[addressBytes.length + checksum.length];
            System.arraycopy(addressBytes, 0, fullBytes, 0, addressBytes.length);
            System.arraycopy(checksum, 0, fullBytes, addressBytes.length, checksum.length);
            
            // 使用 Hutool 的 Base58 编码
            return Base58.encode(fullBytes);
            
        } catch (Exception e) {
            throw new RuntimeException("Hex 转 Base58 失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * Base58 地址转 Hex 地址
     */
    public static String base58ToHex(String base58Address) {
        try {
            // 使用 Hutool 的 Base58 解码
            byte[] decoded = Base58.decode(base58Address);
            
            // 提取地址部分（前21字节）
            byte[] addressBytes = Arrays.copyOfRange(decoded, 0, 21);
            
            // 使用 Hutool 将字节数组转换为 Hex
            String hexAddress = HexUtil.encodeHexStr(addressBytes);
            
            if (hexAddress.startsWith("41") && hexAddress.length() == 42) {
                return "000000000000000000000000" + hexAddress.substring(2);
            } else {
                throw new IllegalArgumentException("无效的 TRON 地址格式: " + hexAddress);
            }
            
        } catch (Exception e) {
            throw new RuntimeException("Base58 转 Hex 失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 计算校验和
     */
    private static byte[] calculateChecksum(byte[] data) {
        byte[] hash1 = DigestUtil.sha256(data);
        byte[] hash2 = DigestUtil.sha256(hash1);
        return Arrays.copyOfRange(hash2, 0, 4);
    }
    
    /**
     * 验证 TRON 地址格式
     */
    public static boolean isValidTronAddress(String address) {
        return address != null && address.length() == 34 && address.startsWith("T");
    }
}