package com.sundot.airport.common.core.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * Redis自增ID生成工具类
 * 格式：前缀 + 日期 + 自增序列号
 */
@Component
public class RedisSerialGenerator {

    @Autowired
    private StringRedisTemplate redisTemplate;

    // 默认配置
    private static final String DEFAULT_PREFIX = "DEFAULT";
    private static final String DEFAULT_DATE_PATTERN = "yyyyMMdd";
    private static final int DEFAULT_SERIAL_LENGTH = 4;
    private static final int DEFAULT_EXPIRE_DAYS = 30;
    private static final String REDIS_KEY_PREFIX = "serial:generator:";

    /**
     * 生成默认格式的序列号 (ORD + yyyyMMdd + 4位序列号)
     */
    public String generate() {
        return generate(DEFAULT_PREFIX, DEFAULT_DATE_PATTERN, DEFAULT_SERIAL_LENGTH);
    }

    /**
     * 生成带自定义前缀的序列号
     */
    public String generate(String prefix) {
        return generate(prefix, DEFAULT_DATE_PATTERN, DEFAULT_SERIAL_LENGTH);
    }

    /**
     * 生成完整自定义格式的序列号
     *
     * @param prefix       前缀
     * @param datePattern  日期格式
     * @param serialLength 序列号长度
     */
    public String generate(String prefix, String datePattern, int serialLength) {
        String datePart = formatDate(new Date(), datePattern);
        String redisKey = buildRedisKey(prefix, datePart);

        // 原子性自增操作
        Long sequence = redisTemplate.opsForValue().increment(redisKey);

        // 如果是新创建的key，设置过期时间
        if (sequence != null && sequence == 1L) {
            redisTemplate.expire(redisKey, DEFAULT_EXPIRE_DAYS, TimeUnit.DAYS);
        }

        // 格式化序列号部分
        String serialPart = String.format("%0" + serialLength + "d", sequence);

        return prefix + datePart + serialPart;
    }

    /**
     * 获取指定日期的当前序列号（不递增）
     */
    public Long getCurrentSequence(String prefix, Date date) {
        String datePart = formatDate(date, DEFAULT_DATE_PATTERN);
        String redisKey = buildRedisKey(prefix, datePart);
        String value = redisTemplate.opsForValue().get(redisKey);
        return value == null ? 0L : Long.parseLong(value);
    }

    /**
     * 重置指定日期的序列号
     */
    public void resetSequence(String prefix, Date date) {
        String datePart = formatDate(date, DEFAULT_DATE_PATTERN);
        String redisKey = buildRedisKey(prefix, datePart);
        redisTemplate.delete(redisKey);
    }

    private String formatDate(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

    private String buildRedisKey(String prefix, String datePart) {
        return REDIS_KEY_PREFIX + prefix + ":" + datePart;
    }

}
