/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 * ******************************************************************************
 * Jan Källman		                Initial Release		        2009-10-01
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 *******************************************************************************/

namespace AppsheetEpplus;

/// <summary>
/// The numberformat of the cell
/// </summary>
public sealed class ExcelNumberFormat : StyleBase {
  internal ExcelNumberFormat(
      ExcelStyles styles,
      XmlHelper.ChangedEventHandler changedEvent,
      int positionId,
      string address,
      int index)
      : base(styles, changedEvent, positionId, address) {
    Index = index;
  }

  /// <summary>
  /// The numeric index fror the format
  /// </summary>
  public int NumFmtID => Index;

  /// <summary>
  /// The numberformat
  /// </summary>
  public string Format {
    get {
      for (int i = 0; i < _styles.NumberFormats.Count; i++) {
        if (Index == _styles.NumberFormats[i].NumFmtId) {
          return _styles.NumberFormats[i].Format;
        }
      }
      return "general";
    }
    set =>
      _ChangedEvent(
          this,
          new(
              eStyleClass.Numberformat,
              eStyleProperty.Format,
              (string.IsNullOrEmpty(value) ? "General" : value),
              _positionID,
              _address));
  }

  internal override string Id => Format;

  /// <summary>
  /// If the numeric format is a build-in from.
  /// </summary>
  public bool BuildIn { get; private set; }

  internal static string GetFromBuildInFromId(int numFmtId) {
    switch (numFmtId) {
      case 0:
        return "General";
      case 1:
        return "0";
      case 2:
        return "0.00";
      case 3:
        return "#,##0";
      case 4:
        return "#,##0.00";
      case 9:
        return "0%";
      case 10:
        return "0.00%";
      case 11:
        return "0.00E+00";
      case 12:
        return "# ?/?";
      case 13:
        return "# ??/??";
      case 14:
        return "mm-dd-yy";
      case 15:
        return "d-mmm-yy";
      case 16:
        return "d-mmm";
      case 17:
        return "mmm-yy";
      case 18:
        return "h:mm AM/PM";
      case 19:
        return "h:mm:ss AM/PM";
      case 20:
        return "h:mm";
      case 21:
        return "h:mm:ss";
      case 22:
        return "m/d/yy h:mm";
      case 37:
        return "#,##0 ;(#,##0)";
      case 38:
        return "#,##0 ;[Red](#,##0)";
      case 39:
        return "#,##0.00;(#,##0.00)";
      case 40:
        return "#,##0.00;[Red](#,##0.00)";
      case 45:
        return "mm:ss";
      case 46:
        return "[h]:mm:ss";
      case 47:
        return "mmss.0";
      case 48:
        return "##0.0";
      case 49:
        return "@";
      default:
        return string.Empty;
    }
  }

  internal static int GetFromBuildIdFromFormat(string format) {
    switch (format) {
      case "General":
      case "":
        return 0;
      case "0":
        return 1;
      case "0.00":
        return 2;
      case "#,##0":
        return 3;
      case "#,##0.00":
        return 4;
      case "0%":
        return 9;
      case "0.00%":
        return 10;
      case "0.00E+00":
        return 11;
      case "# ?/?":
        return 12;
      case "# ??/??":
        return 13;
      case "mm-dd-yy":
        return 14;
      case "d-mmm-yy":
        return 15;
      case "d-mmm":
        return 16;
      case "mmm-yy":
        return 17;
      case "h:mm AM/PM":
        return 18;
      case "h:mm:ss AM/PM":
        return 19;
      case "h:mm":
        return 20;
      case "h:mm:ss":
        return 21;
      case "m/d/yy h:mm":
        return 22;
      case "#,##0 ;(#,##0)":
        return 37;
      case "#,##0 ;[Red](#,##0)":
        return 38;
      case "#,##0.00;(#,##0.00)":
        return 39;
      case "#,##0.00;[Red](#,##0.00)":
        return 40;
      case "mm:ss":
        return 45;
      case "[h]:mm:ss":
        return 46;
      case "mmss.0":
        return 47;
      case "##0.0":
        return 48;
      case "@":
        return 49;
      default:
        return int.MinValue;
    }
  }
}
