/**
 * @category Unit
 */
export class UnitPrefix {
    static readonly DECA = new UnitPrefix('deca', 'da', 1e1);
    static readonly HECTO = new UnitPrefix('hecto', 'h', 1e2);
    static readonly KILO = new UnitPrefix('kilo', 'k', 1e3);
    static readonly MEGA = new UnitPrefix('mega', 'M', 1e6);
    static readonly GIGA = new UnitPrefix('giga', 'G', 1e9);
    static readonly TERA = new UnitPrefix('tera', 'T', 1e12);
    static readonly PETA = new UnitPrefix('peta', 'P', 1e15);
    static readonly EXA = new UnitPrefix('exa', 'E', 1e18);
    static readonly ZETTA = new UnitPrefix('zetta', 'Z', 1e21);
    static readonly YOTTA = new UnitPrefix('yotta', 'Y', 1e24);
    static readonly DECI = new UnitPrefix('deci', 'd', 1e-1);
    static readonly CENTI = new UnitPrefix('centi', 'c', 1e-2);
    static readonly MILLI = new UnitPrefix('milli', 'm', 1e-3);
    static readonly MICRO = new UnitPrefix('micro', 'u', 1e-6);
    static readonly NANO = new UnitPrefix('nano', 'n', 1e-9);
    static readonly PICO = new UnitPrefix('pico', 'p', 1e-12);
    static readonly FEMTO = new UnitPrefix('femto', 'f', 1e-15);
    static readonly ATTO = new UnitPrefix('atto', 'a', 1e-18);
    static readonly ZEPTO = new UnitPrefix('zepto', 'z', 1e-21);
    static readonly YOCTO = new UnitPrefix('yocto', 'y', 1e-24);

    static readonly DECIMAL: UnitPrefix[] = [
        UnitPrefix.DECA,
        UnitPrefix.HECTO,
        UnitPrefix.KILO,
        UnitPrefix.MEGA,
        UnitPrefix.GIGA,
        UnitPrefix.TERA,
        UnitPrefix.PETA,
        UnitPrefix.EXA,
        UnitPrefix.ZETTA,
        UnitPrefix.YOTTA,
        UnitPrefix.DECI,
        UnitPrefix.CENTI,
        UnitPrefix.MILLI,
        UnitPrefix.MICRO,
        UnitPrefix.NANO,
        UnitPrefix.PICO,
        UnitPrefix.FEMTO,
        UnitPrefix.ATTO,
        UnitPrefix.ZEPTO,
        UnitPrefix.YOCTO,
    ];

    name: string;
    abbrevation: string;
    magnitude: number;

    private constructor(name: string, abbrevation: string, magnitude: number) {
        this.name = name;
        this.abbrevation = abbrevation;
        this.magnitude = magnitude;
    }

    get namePattern(): RegExp {
        return new RegExp(`/^${this.name}/g`);
    }

    get abbrevationPattern(): RegExp {
        return new RegExp(`/^${this.abbrevation}/g`);
    }
}

export type UnitPrefixType = 'decimal' | 'none';
