package org.example.Entity.System;

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

public class SpecNo implements Comparable<SpecNo> {
    // 字符集合（与C#保持一致，包含数字、小写字母、大写字母，注意重复的's'和'S'）
    private static final List<Character> valueArray;

    static {
        valueArray = new ArrayList<>();
        // 添加数字 0-9
        for (char c = '0'; c <= '9'; c++) {
            valueArray.add(c);
        }
        // 添加小写字母 a-z（包含重复的's'）
        for (char c = 'a'; c <= 'z'; c++) {
            valueArray.add(c);
        }
        valueArray.add('s'); // 原C#中重复的's'
        // 添加大写字母 A-Z（包含重复的'S'和'Y'）
        for (char c = 'A'; c <= 'Z'; c++) {
            valueArray.add(c);
        }
        valueArray.add('S'); // 原C#中重复的'S'
        valueArray.add('Y'); // 原C#中重复的'Y'
    }

    private char f;
    private char e;
    private int findex = -1;
    private int eindex = -1;
    private static int count = -1;

    // 构造方法：接收int值
    public SpecNo(int val) {
        int count = getCount();
        int leftIndex = val / count;
        if (leftIndex > count) {
            leftIndex = leftIndex / count;
        }
        int sIndex = val % count;
        this.f = valueArray.get(leftIndex);
        this.e = valueArray.get(sIndex);
    }

    // 构造方法：接收字符串
    public SpecNo(String val) {
        String str = "00" + (val == null ? "" : val);
        int start = Math.max(0, str.length() - 2);
        String sub = str.substring(start);
        char[] ca = sub.toCharArray();
        this.f = ca[0];
        this.e = ca[1];
    }

    // 构造方法：接收两个字符
    public SpecNo(char f, char e) {
        this.f = f;
        this.e = e;
    }

    // 获取字符集合长度（缓存）
    private static int getCount() {
        if (count < 0) {
            count = valueArray.size();
        }
        return count;
    }

    // 获取f的索引（懒加载）
    public int getFIndex() {
        if (findex == -1) {
            findex = valueArray.indexOf(f);
        }
        return findex;
    }

    // 获取e的索引（懒加载）
    public int getEIndex() {
        if (eindex == -1) {
            eindex = valueArray.indexOf(e);
        }
        return eindex;
    }

    // 转换为int值
    public int toInt() {
        return getFIndex() * getCount() + getEIndex();
    }

    // 比较方法（实现Comparable接口）
    @Override
    public int compareTo(SpecNo other) {
        if (other == null) {
            return 1;
        }
        if (this.getFIndex() > other.getFIndex()) {
            return 1;
        } else if (this.getFIndex() < other.getFIndex()) {
            return -1;
        } else {
            return Integer.compare(this.getEIndex(), other.getEIndex());
        }
    }

    // 重写equals方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        SpecNo specNo = (SpecNo) obj;
        return getFIndex() == specNo.getFIndex() && getEIndex() == specNo.getEIndex();
    }

    // 重写hashCode方法
    @Override
    public int hashCode() {
        return toString().hashCode();
    }

    // 重写toString方法
    @Override
    public String toString() {
        return f + String.valueOf(e);
    }

    // 运算符>的替代方法
    public boolean greaterThan(SpecNo other) {
        if (this.getFIndex() > other.getFIndex()) {
            return true;
        } else if (this.getFIndex() == other.getFIndex()) {
            return this.getEIndex() > other.getEIndex();
        }
        return false;
    }

    // 运算符<的替代方法
    public boolean lessThan(SpecNo other) {
        if (this.getFIndex() < other.getFIndex()) {
            return true;
        } else if (this.getFIndex() == other.getFIndex()) {
            return this.getEIndex() < other.getEIndex();
        }
        return false;
    }

    // 运算符+的替代方法
    public SpecNo add(int value) {
        int val = this.toInt() + value;
        return new SpecNo(val);
    }

    // 运算符-的替代方法
    public SpecNo subtract(int value) {
        int val = Math.abs(this.toInt() - value);
        return new SpecNo(val);
    }

    // 自增（++）的替代方法
    public SpecNo increment() {
        return this.add(1);
    }

    // 自减（--）的替代方法
    public SpecNo decrement() {
        return this.subtract(1);
    }

    // 静态方法：从int转换为SpecNo（替代隐式转换）
    public static SpecNo valueOf(int value) {
        return new SpecNo(value);
    }

    // 静态方法：从String转换为SpecNo（替代隐式转换）
    public static SpecNo valueOf(String value) {
        return new SpecNo(value);
    }
}