namespace AppsheetEpplus;

public class ExcelDxfNumberFormat : DxfStyleBase<ExcelDxfNumberFormat> {
  public ExcelDxfNumberFormat(ExcelStyles styles)
      : base(styles) {}

  private int _numFmtID = int.MinValue;

  /// <summary>
  /// Id for number format
  ///
  /// Build in ID's
  ///
  /// 0   General
  /// 1   0
  /// 2   0.00
  /// 3   #,##0
  /// 4   #,##0.00
  /// 9   0%
  /// 10  0.00%
  /// 11  0.00E+00
  /// 12  # ?/?
  /// 13  # ??/??
  /// 14  mm-dd-yy
  /// 15  d-mmm-yy
  /// 16  d-mmm
  /// 17  mmm-yy
  /// 18  h:mm AM/PM
  /// 19  h:mm:ss AM/PM
  /// 20  h:mm
  /// 21  h:mm:ss
  /// 22  m/d/yy h:mm
  /// 37  #,##0 ;(#,##0)
  /// 38  #,##0 ;[Red](#,##0)
  /// 39  #,##0.00;(#,##0.00)
  /// 40  #,##0.00;[Red](#,##0.00)
  /// 45  mm:ss
  /// 46  [h]:mm:ss
  /// 47  mmss.0
  /// 48  ##0.0E+0
  /// 49  @
  /// </summary>
  public int NumFmtID {
    get => _numFmtID;
    internal set => _numFmtID = value;
  }

  private string _format = "";

  public string Format {
    get => _format;
    set {
      _format = value;
      NumFmtID = ExcelNumberFormat.GetFromBuildIdFromFormat(value);
    }
  }

  protected internal override string Id => Format;

  protected internal override void CreateNodes(XmlHelper helper, string path) {
    if (NumFmtID < 0 && !string.IsNullOrEmpty(Format)) {
      NumFmtID = _styles._nextDfxNumFmtID++;
    }
    helper.CreateNode(path);
    SetValue(helper, path + "/@numFmtId", NumFmtID);
    SetValue(helper, path + "/@formatCode", Format);
  }

  protected internal override bool HasValue => !string.IsNullOrEmpty(Format);

  protected internal override ExcelDxfNumberFormat Clone() {
    return new(_styles) {
      NumFmtID = NumFmtID,
      Format = Format,
    };
  }
}
