package com.payment_system.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

public class OrderNoGenerator {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    private static final AtomicInteger counter = new AtomicInteger(0);
    private static final int MAX_RANDOM = 9999;

    // 添加机器标识（自动生成）
    private static final String MACHINE_ID = generateMachineId();

    // 生成基础订单号（时间戳+4位随机数）
    public static String generateBase() {
        return DATE_FORMAT.format(new Date()) + String.format("%04d", new Random().nextInt(MAX_RANDOM));
    }

    // 生成带递增序列的订单号（防同一毫秒内重复）
    public static synchronized String generateIncremental() {
        int seq = counter.getAndIncrement() % 1000;
        return DATE_FORMAT.format(new Date()) + String.format("%03d", seq);
    }

    // 生成25位订单号（17时间戳 + 2业务码 + 2机器码 + 4序列号）
    public static synchronized String generate25Digit() {
        // 17位时间戳 (yyyyMMddHHmmssSSS)
        String timestamp = DATE_FORMAT.format(new Date());

        // 2位业务标识（例如：01-支付, 02-退款...）
        String businessCode = "01";

        // 2位机器标识
        String machineId = MACHINE_ID;

        // 4位序列号 (0000-9999)
        int sequence = counter.getAndIncrement() % 10000;
        String sequencePart = String.format("%04d", sequence);

        // 拼接并返回 -> 总长度 17+2+2+4=25
        return timestamp + businessCode + machineId + sequencePart;
    }

    // 自动生成机器标识（基于系统属性）
    private static String generateMachineId() {
        try {
            // 尝试获取主机名最后两位字符
            String hostname = System.getenv("COMPUTERNAME");
            if (hostname == null || hostname.length() < 2) {
                hostname = "VM";
            }
            return hostname.substring(hostname.length() - 2).toUpperCase();
        } catch (Exception e) {
            // 回退方案：使用随机字符
            return String.format("%02d", new Random().nextInt(100));
        }
    }


    public static void main(String[] args) {
        System.out.println(generateBase());
        System.out.println(generateIncremental());
        System.out.println(generate25Digit());
    }
}

