package com.yc.ship.module.resource.helper;

import java.util.ArrayList;
import java.util.List; 

public class RoomNumberHelper {

    /**
     * 生成带楼层号的房间号列表
     * @param floor 楼层号（必须为单个字符）
     * @param start 起始房间号（必须为正整数）
     * @param count 生成数量（必须>0）
     * @param totalLength 房间号总长度（包含楼层号，必须≥2）
     * @return 固定长度的房间号列表，格式为：[楼层号][格式化后的数字部分]
     * @throws IllegalArgumentException 参数非法时抛出
     */
    public static synchronized List<String> generate(String floor, long start, int count, int totalLength) {
        // 参数校验
        if (floor == null || floor.length()  != 1) {
            throw new IllegalArgumentException("楼层号必须为单个字符");
        }
        if (start < 1 || count < 1 || totalLength < 2) {
            throw new IllegalArgumentException("起始号、数量必须为正整数，总长度至少为2");
        }
        // 数字部分的长度
        int numberLength = totalLength - 1;
        // 检查数字部分是否溢出
        long maxNumber = start + count - 1;
        if (String.valueOf(maxNumber).length()  > numberLength) {
            throw new IllegalArgumentException("房间号数字部分溢出: 起始号+数量超过指定长度");
        }

        List<String> roomNumbers = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            long currentNum = start + i;
            // 格式化数字部分（左侧补零至numberLength位）
            String numberPart = formatNumber(currentNum, numberLength);
            // 拼接楼层号和数字部分
            roomNumbers.add(floor  + numberPart);
        }
        return roomNumbers;
    }

    /**
     * 数字格式化补零
     * @param number 原始数字
     * @param length 目标长度（指数字部分的长度）
     * @return 左侧补零后的字符串
     */
    private static String formatNumber(long number, int length) {
        String numStr = String.valueOf(number); 
        if (numStr.length()  >= length) {
            return numStr;
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length - numStr.length();  i++) {
            sb.append('0'); 
        }
        return sb.append(numStr).toString(); 
    }
}