//package com.m2pool.pool.utils;
//
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.JsonMappingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.m2pool.common.core.text.Convert;
//import com.m2pool.common.core.utils.StringUtils;
//import com.m2pool.pool.entity.NotifyMsgAlph;
//import com.m2pool.pool.entity.TempMiner;
//import org.apache.commons.codec.DecoderException;
//import org.apache.commons.codec.binary.Hex;
//import org.apache.commons.codec.digest.Blake3;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//import org.springframework.scheduling.annotation.EnableAsync;
//
//import java.io.IOException;
//import java.io.OutputStream;
//import java.math.BigDecimal;
//import java.math.BigInteger;
//import java.math.MathContext;
//import java.math.RoundingMode;
//import java.nio.ByteBuffer;
//import java.nio.ByteOrder;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Description TODO
// * @Date 2025/3/17 10:17
// * @Author 杜懿
// */
//@SpringBootApplication
//@EnableAsync
//public class AlphMining {
//
//    private final static char[] digits = "0123456789abcdef".toCharArray();
//
//    private static final ObjectMapper mapper = new ObjectMapper();
//
//    public static void main(String[] args) {
//        TempMiner miner = new TempMiner();
//        //**自定义miner属性值
//        miner.setCoin("");
//        miner.setPool("");
//        miner.setUser("");
//        miner.setPassword("");
//        int count = 0;
//        int start = 0;
//        // 自定义结束
//        hash(miner);
//        //fmt.Printf("coin %v pool %v user %v password %v count %v start %v\n", *coin, *pool, *user, *password, *count, *start)
//
//    }
//
//    private static JSONObject subscribe(TempMiner m){
//        m.setState("subscribe");
//        // fmt.Sprintf("{\"id\": %d,
//        // \"method\": \"mining.subscribe\",
//        // \"params\": [\"YxMiner/v20.0.0\"]}\n", m.Id)
//        JSONObject requestBody = new JSONObject();
//        requestBody.put("id", m.getId());
//        requestBody.put("method", "mining.subscribe");
//        requestBody.put("params","YxMiner/v20.0.0");
//        return requestBody;
//    }
//
//    private static JSONObject authorize(TempMiner m){
//        m.setState("authorize");
//        // fmt.Sprintf(
//        //		"{\"id\": %d, \"jsonrpc\": \"2.0\", \"method\": \"mining.authorize\", \"params\": [\"%s\"]}\n",
//        JSONObject requestBody = new JSONObject();
//        requestBody.put("id", m.getId());
//        requestBody.put("jsonrpc", "2.0");
//        requestBody.put("method", "mining.authorize");
//        requestBody.put("params",m.getUser());
//        return requestBody;
//    }
//
//    private static JSONObject submit(TempMiner m,String nonce){
//        m.setState("submit");
//        if(StringUtils.isNull(m.getExtraNonce1())){
//            m.setExtraNonce1("");
//        }
//        String finalNonce = m.getExtraNonce1().concat(nonce);
//        //fmt.Sprintf(
//        //		"{\"params\": [\"%s\", \"%s\", \"%s\"], \"id\": %d, \"method\": \"mining.submit\"}\n",
//        //		m.User,
//        //		m.JobId,
//        //		final_nonce,
//        //		m.Id,
//        JSONObject requestBody = new JSONObject();
//        String[] params ={m.getUser(),m.getJobId(),finalNonce};
//        requestBody.put("params", params);
//        requestBody.put("id", m.getId());
//        requestBody.put("method", "mining.submit");
//        return requestBody;
//    }
//
//    private static JSONObject pong(TempMiner m,float pingId){
//        BigInteger pongID = BigInteger.valueOf(Convert.toLong(pingId,0L));
//        //
//        JSONObject requestBody = new JSONObject();
//        requestBody.put("id", pongID);
//        requestBody.put("result", "pong");
//        requestBody.put("error",null);
//        return requestBody;
//    }
//
//    private static byte[] hash(TempMiner m) throws DecoderException {
//        // 解码Header
//        byte[] headerBytes = Hex.decodeHex(m.getHeader().toCharArray());
//        long nonce = m.getNonce();
//        m.setBlockNonce(m.getNonce());
//        byte[] nonceBytes = ByteBuffer.allocate(8)
//                .order(ByteOrder.LITTLE_ENDIAN)
//                .putLong(nonce)
//                .array();
//        // 解码ExtraNonce1
//        byte[] extraBytes = Hex.decodeHex(m.getExtraNonce1().toCharArray());
//
//        byte[] inb = new byte[49];
//        System.arraycopy(headerBytes, 0, inb, 0, 32);    // 前32字节
//        inb[32] = 0x10;                                   // 固定分隔符
//        System.arraycopy(nonceBytes, 0, inb, 33, 8);      // 33-40字节
//        System.arraycopy(extraBytes, 0, inb, 41, 8);      // 41-48字节
//
//        m.setBlockData(Hex.encodeHexString(inb));
//
//        //fmt.Printf("[nexa]in %s", hex.EncodeToString(inb))
//        byte[] hashResult = hexStringToBytes(hashHandle(m.getBlockData()));
//        byte[] outputs32 = new byte[32];
//        for (int i = 0; i < 32; i++) {
//            outputs32[i] = hashResult[31 - i];
//        }
//
//        return outputs32;
//    }
//
//    public static BigInteger  difficultyToTarget(double diff) throws ArithmeticException{
//        if (diff <= 0) {
//            throw new ArithmeticException("Difficulty must be greater than zero");
//        }
//
//        // 创建大整数 2^224
//        BigInteger twoTo224 = BigInteger.ONE.shiftLeft(224);
//
//        // 使用 big.Float 进行高精度计算
//        BigDecimal difficultyDecimal = new BigDecimal(diff);
//
//        // 将 2^224 转换为 big.Float
//        BigDecimal   twoTo224Decimal = new BigDecimal(twoTo224);
//
//        // 计算目标值 = 2^224 / 难度
//        try {
//            // 使用UNNECESSARY模式确保精确除法
//            BigDecimal targetDecimal = twoTo224Decimal.divide(
//                    difficultyDecimal,
//                    new MathContext(0, RoundingMode.UNNECESSARY)
//            );
//
//            // 4. 转换为BigInteger
//            return targetDecimal.toBigIntegerExact();
//
//        } catch (ArithmeticException e) {
//            throw new ArithmeticException("Conversion resulted in inexact result: " + e.getMessage());
//        }
//    }
//
//    private static void lookup(TempMiner m){
//        //
//        System.out.println("Lookup start");
//        m.setRunning(true);
//        while (m.isRunning()){
//            try {
//                if(m.isNewJob()){
//                    m.setNewJob(false);
//                    m.getNewJobCh().poll(10, TimeUnit.MILLISECONDS);
//                    System.out.println("Lookup New job");
//                }
//                byte[] hashBytes = hash(m);
//                m.setNonce(m.getNonce()+1);
//                // 比较哈希难度
//                BigInteger hashInt = new BigInteger(1, hashBytes);
//                BigInteger diffInt = difficultyToTarget(m.getDifficulty());
//
//                if (hashInt.compareTo(diffInt) <= 0) {
//                    // 比较当前target（hashint）和下发的任务target （diffint） <=0代表
//
//                    System.out.printf("calc diff %s\ntarget diff %s\n",
//                            hashInt.toString(), diffInt.toString());
//                    System.out.println("block data " + m.getBlockData());
//
//                    // 准备提交数据
//                    ByteBuffer buffer = ByteBuffer.allocate(8)
//                            .order(ByteOrder.LITTLE_ENDIAN)
//                            .putLong(m.getBlockNonce());
//                    String submitData = Hex.encodeHexString(buffer.array());
//
//                    // 发送提交请求
//                    JSONObject response = submit(m, submitData);
//                    System.out.println("submit " + response);
//                    m.getConn().write(response.toJSONString().getBytes());
//                }
//                Thread.sleep(10); // 10毫秒间隔
//            }catch (InterruptedException | IOException | DecoderException e){
//                System.out.println("Error in lookup: " + e.getMessage());
//                m.setRunning(false);
//            }
//
//        }
//        System.out.println("Lookup end");
//    }
//
//    public static void handle(TempMiner m, String msg, OutputStream conn){
//        //
//        m.setConn(conn);
//        try {
//            Map<String,Object> ret = mapper.readValue(msg,Map.class);
//            if (ret.containsKey("method")){
//                String method = Convert.toStr(ret.get("method"));
//                switch (method){
//                    case "mining.notify":
//                        handleNotify(msg);
//                        break;
//                    case "mining.set_difficulty":
//                        handleSetDifficulty(msg);
//                        break;
//                    case "mining.ping":
//                        handlePing(msg);
//                        break;
//                }
//            }else {
//                handleStatefulMessage(msg);
//            }
//        }catch (IOException e){
//            System.out.println("JSON解析错误: " + e.getMessage());
//        } catch (JsonMappingException e) {
//            e.printStackTrace();
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//        }
//
//    }
//
//    public static void handleNotify(TempMiner m,String msg) throws IOException {
//        NotifyMsgAlph notify = mapper.readValue(msg, NotifyMsgAlph.class);
//
//        if () {
//            newJob = true;
//            while (newJob) {
//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    Thread.currentThread().interrupt();
//                }
//            }
//        }
//
//        this.jobId = notify.params[0];
//        this.header = notify.params[1];
//        this.nBits = notify.params[2];
//        this.jobTime = Long.parseLong(notify.params[3]);
//        this.nonce = 0;
//
//        if (!running) {
//            startMining();
//        } else {
//            newJobCh.offer(true);
//        }
//    }
//
//    private void handleSetDifficulty(String msg) throws IOException {
//        DifficultyMsg diff = mapper.readValue(msg, DifficultyMsg.class);
//        this.difficulty = diff.params[0];
//    }
//
//    private static String hashHandle(String in)     {
//        //字符串判空
//        if(StringUtils.isBlank(in)){
//            return null;
//        }
//        Blake3 hasher = Blake3.initHash();
//        byte[] hash = new byte[32];
//        hasher.update(hexStringToBytes(in));
//        hasher.doFinalize(hash);
//        String result1 = bytesToHexString(hash);
//        System.out.println(result1);
//
//        hasher.reset();
//        byte[] hash2 = new byte[32];
//        hasher.update(hexStringToBytes(result1));
//        hasher.doFinalize(hash2);
//        String result2 = bytesToHexString(hash2);
//        System.out.println(result2);
//        return  result2;
//    }
//
//    /**
//     * 高效写法 16进制字符串转成byte数组
//     *
//     * @param hex 16进制字符串，支持大小写
//     * @return byte数组
//     */
//    public static byte[] hexStringToBytes(String hex) {
//        byte[] result = new byte[hex.length() / 2];
//        char[] chars = hex.toCharArray();
//        for (int i = 0, j = 0; i < result.length; i++) {
//            result[i] = (byte) (toByte(chars[j++]) << 4 | toByte(chars[j++]));
//        }
//        return result;
//    }
//
//    private static int toByte(char c) {
//        if (c >= '0' && c <= '9') return (c - '0');
//        if (c >= 'A' && c <= 'F') return (c - 'A' + 0x0A);
//        if (c >= 'a' && c <= 'f') return (c - 'a' + 0x0a);
//        throw new RuntimeException("invalid hex char '" + c + "'");
//    }
//
//
//    /**
//     * 高效写法 byte数组转成16进制字符串
//     *
//     * @param bytes byte数组
//     * @return 16进制字符串
//     */
//    public static String bytesToHexString(byte[] bytes) {
//        char[] buf = new char[bytes.length * 2];
//        int c = 0;
//        for (byte b : bytes) {
//            buf[c++] = digits[(b >> 4) & 0x0F];
//            buf[c++] = digits[b & 0x0F];
//        }
//        return new String(buf);
//    }
//}
