import 'package:vid/us/vid_us_unit.dart';

class UnitDescriptionMap {
  static UnitDescriptionMap? _instance;
  static UnitDescriptionMap get _singleton {
    if (_instance == null) {
      _instance = UnitDescriptionMap._();
      _instance!._initMap();
    }
    return _instance!;
  }

  final Map<VidUsUnit, String> _map = {};
  UnitDescriptionMap._();

  /// 获取描述
  ///
  /// [unit] flutter_vid 内置枚举
  static String getDesc(VidUsUnit unit) {
    return _singleton._getDesc(unit);
  }

  /// 获取描述
  ///
  /// [value] vinno单位通用枚举值
  static String getDescByInt(int value) {
    final unit = VidUsUnitMap.getUnit(value);
    return _singleton._getDesc(unit);
  }

  String _getDesc(VidUsUnit unit) {
    if (_map.containsKey(unit)) {
      return _map[unit]!;
    }
    return unit.name;
  }

  void _add(VidUsUnit unit, [String? description]) {
    final desc = description ?? unit.name;
    _map[unit] = desc;
  }

  void _initMap() {
    _add(VidUsUnit.None, '');
    _add(VidUsUnit.percent, '%');
    //Length
    _add(VidUsUnit.cm);
    _add(VidUsUnit.mm);
    _add(VidUsUnit.um, "μm");
    _add(VidUsUnit.inch, 'in');
    _add(VidUsUnit.ft);
    //Time
    _add(VidUsUnit.s);
    _add(VidUsUnit.minute, 'min');
    _add(VidUsUnit.hour, 'h');
    _add(VidUsUnit.day, 'Day');
    _add(VidUsUnit.week, 'Week');
    _add(VidUsUnit.week_day, 'WeekDay');
    _add(VidUsUnit.Tick, '');
    _add(VidUsUnit.msec, 'ms');
    //Angle
    _add(VidUsUnit.degree, '° ');
    _add(VidUsUnit.radian, 'rad');
    //Weight
    _add(VidUsUnit.g, 'g');
    _add(VidUsUnit.mg, 'mg');
    _add(VidUsUnit.ng, 'ng');
    _add(VidUsUnit.kg, 'kg');
    _add(VidUsUnit.oz);
    _add(VidUsUnit.lb);
    //Area
    _add(VidUsUnit.cm2, 'cm²');
    _add(VidUsUnit.mm2, 'mm²');
    _add(VidUsUnit.m2, 'm²');
    //Volumn
    _add(VidUsUnit.cm3, 'cm³');
    _add(VidUsUnit.mm3, 'mm³');
    _add(VidUsUnit.ml, 'ml');
    _add(VidUsUnit.L, 'L');
    _add(VidUsUnit.mil, 'μl');
    //Velocity
    _add(VidUsUnit.cms, 'cm/s');
    _add(VidUsUnit.mms, 'mm/s');
    _add(VidUsUnit.ms, 'm/s');
    //Acceleration
    _add(VidUsUnit.cms2, 'cm/s²');
    _add(VidUsUnit.mms2, 'mm/s²');
    //Flow
    _add(VidUsUnit.cm3s, 'cm³/s');
    _add(VidUsUnit.mls, 'ml/s');
    _add(VidUsUnit.mlmin, 'ml/min');
    _add(VidUsUnit.Lmin, 'L/min');
    //Density
    _add(VidUsUnit.gcm3, 'g/cm³');
    _add(VidUsUnit.gml, 'g/ml');
    _add(VidUsUnit.ngml, 'ng/ml');
    //Pressure
    _add(VidUsUnit.mmHg);
    //Voltage
    _add(VidUsUnit.mV);
    //Frequency
    _add(VidUsUnit.Hz);
    _add(VidUsUnit.KHz, 'kHz');
    _add(VidUsUnit.HR, 'bpm');
    //SI
    _add(VidUsUnit.cm3m2, 'cm³/m²');
    _add(VidUsUnit.mlm2, 'ml/m²');
    //CI
    _add(VidUsUnit.cm3sm2, 'cm³/s/m²');
    _add(VidUsUnit.mlsm2, 'ml/s/m²');
    _add(VidUsUnit.cm3minm2, 'cm³/min/m²');
    _add(VidUsUnit.mlminm2, 'ml/min/m²');
    _add(VidUsUnit.Lminm2, 'L/min.m²');
    _add(VidUsUnit.mlmincm2, 'ml/min.cm²');
    _add(VidUsUnit.circs, 'circ/s');
    //CO
    _add(VidUsUnit.mlbeat, 'ml/beat');
    //PWV
    _add(VidUsUnit.mm2pa, 'mm²/Pa');
    _add(VidUsUnit.d1mpa, '1/MPa');
    _add(VidUsUnit.kpa, 'kPa');
    _add(VidUsUnit.mmHgs, 'mmHg/s');
    _add(VidUsUnit.gm2, 'g/m²');
    //AVA Index
    _add(VidUsUnit.cm2m2, 'cm²/m²');
    //TAM/MAM

    //Temperature

    //Resistance
  }
}