package com.emotion.config;

import com.emotion.util.SnowflakeIdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.net.InetAddress;
import java.net.NetworkInterface;

/**
 * ID生成器配置类
 * 
 * @author huazhongmin
 * @date 2025-07-23
 */
@Slf4j
@Configuration
public class IdGeneratorConfig {

    /**
     * 机器ID配置（可通过配置文件指定）
     */
    @Value("${emotion.snowflake.machine-id:#{null}}")
    private Long machineId;

    /**
     * 配置雪花算法ID生成器
     * 
     * @return SnowflakeIdGenerator实例
     */
    @Bean
    public SnowflakeIdGenerator snowflakeIdGenerator() {
        long finalMachineId;
        
        if (machineId != null) {
            // 使用配置文件中指定的机器ID
            finalMachineId = machineId;
            log.info("使用配置文件指定的机器ID: {}", finalMachineId);
        } else {
            // 自动生成机器ID
            finalMachineId = generateMachineId();
            log.info("自动生成机器ID: {}", finalMachineId);
        }
        
        return new SnowflakeIdGenerator(finalMachineId);
    }
    
    /**
     * 自动生成机器ID
     * 基于MAC地址和IP地址生成唯一的机器ID
     * 
     * @return 机器ID (0-1023)
     */
    private long generateMachineId() {
        try {
            // 获取本机IP地址
            InetAddress localHost = InetAddress.getLocalHost();
            
            // 获取网络接口
            NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
            
            if (networkInterface != null) {
                // 获取MAC地址
                byte[] hardwareAddress = networkInterface.getHardwareAddress();
                
                if (hardwareAddress != null && hardwareAddress.length >= 6) {
                    // 使用MAC地址的后两个字节生成机器ID
                    long machineId = ((hardwareAddress[4] & 0xFF) << 8) | (hardwareAddress[5] & 0xFF);
                    // 确保机器ID在有效范围内 (0-1023)
                    return machineId & 0x3FF;
                }
            }
            
            // 如果无法获取MAC地址，使用IP地址生成
            byte[] address = localHost.getAddress();
            if (address.length >= 4) {
                // 使用IP地址的后两个字节生成机器ID
                long machineId = ((address[2] & 0xFF) << 8) | (address[3] & 0xFF);
                return machineId & 0x3FF;
            }
            
        } catch (Exception e) {
            log.warn("自动生成机器ID失败，使用默认策略: {}", e.getMessage());
        }
        
        // 如果所有方法都失败，使用当前时间戳生成
        return System.currentTimeMillis() % 1024;
    }
}
