/*******************************************************************************
 * 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		Added		30-AUG-2010
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 *******************************************************************************/

using System;
using System.Globalization;
using System.Xml;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml.Table;

/// <summary>
/// Build-in table row functions
/// </summary>
public enum RowFunctions {
  Average,
  Count,
  CountNums,
  Custom,
  Max,
  Min,
  None,
  StdDev,
  Sum,
  Var,
}

/// <summary>
/// A table column
/// </summary>
public class ExcelTableColumn : XmlHelper {
  internal ExcelTable _tbl;

  internal ExcelTableColumn(XmlNamespaceManager ns, XmlNode topNode, ExcelTable tbl, int pos)
      : base(ns, topNode) {
    _tbl = tbl;
    Position = pos;
  }

  /// <summary>
  /// The column id
  /// </summary>
  public int Id {
    get => GetXmlNodeInt("@id");
    set => SetXmlNodeString("@id", value.ToString());
  }

  /// <summary>
  /// The position of the column
  /// </summary>
  public int Position { get; private set; }

  /// <summary>
  /// The name of the column
  /// </summary>
  public string Name {
    get {
      var n = GetXmlNodeString("@name");
      if (string.IsNullOrEmpty(n)) {
        if (_tbl.ShowHeader) {
          n = ConvertUtil.ExcelDecodeString(
              _tbl.WorkSheet.GetValue<string>(
                  _tbl.Address._fromRow,
                  _tbl.Address._fromCol + Position));
        } else {
          n = "Column" + (Position + 1);
        }
      }
      return n;
    }
    set {
      var v = ConvertUtil.ExcelEncodeString(value);
      SetXmlNodeString("@name", v);
      if (_tbl.ShowHeader) {
        _tbl.WorkSheet.SetValue(_tbl.Address._fromRow, _tbl.Address._fromCol + Position, value);
      }
      _tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
    }
  }

  /// <summary>
  /// A string text in the total row
  /// </summary>
  public string TotalsRowLabel {
    get => GetXmlNodeString("@totalsRowLabel");
    set => SetXmlNodeString("@totalsRowLabel", value);
  }

  /// <summary>
  /// Build-in total row functions.
  /// To set a custom Total row formula use the TotalsRowFormula property
  /// <seealso cref="TotalsRowFormula"/>
  /// </summary>
  public RowFunctions TotalsRowFunction {
    get {
      if (GetXmlNodeString("@totalsRowFunction") == "") {
        return RowFunctions.None;
      }
      return (RowFunctions)
        Enum.Parse(typeof(RowFunctions), GetXmlNodeString("@totalsRowFunction"), true);
    }
    set {
      if (value == RowFunctions.Custom) {
        throw (new("Use the TotalsRowFormula-property to set a custom table formula"));
      }
      string s = value.ToString();
      s = s.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + s.Substring(1, s.Length - 1);
      SetXmlNodeString("@totalsRowFunction", s);
      _tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
    }
  }

  private const string _totalsrowformulaPath = "d:totalsRowFormula";

  /// <summary>
  /// Sets a custom Totals row Formula.
  /// Be carefull with this property since it is not validated.
  /// <example>
  /// tbl.Columns[9].TotalsRowFormula = string.Format("SUM([{0}])",tbl.Columns[9].Name);
  /// </example>
  /// </summary>
  public string TotalsRowFormula {
    get => GetXmlNodeString(_totalsrowformulaPath);
    set {
      if (value.StartsWith("=")) {
        value = value.Substring(1, value.Length - 1);
      }
      SetXmlNodeString("@totalsRowFunction", "custom");
      SetXmlNodeString(_totalsrowformulaPath, value);
      _tbl.WorkSheet.SetTableTotalFunction(_tbl, this);
    }
  }

  private const string _datacellstylePath = "@dataCellStyle";

  /// <summary>
  /// The named style for datacells in the column
  /// </summary>
  public string DataCellStyleName {
    get => GetXmlNodeString(_datacellstylePath);
    set {
      if (_tbl.WorkSheet.Workbook.Styles.NamedStyles.FindIndexById(value) < 0) {
        throw (new(string.Format("Named style {0} does not exist.", value)));
      }
      SetXmlNodeString(TopNode, _datacellstylePath, value, true);

      int fromRow = _tbl.Address._fromRow + (_tbl.ShowHeader ? 1 : 0),
          toRow = _tbl.Address._toRow - (_tbl.ShowTotal ? 1 : 0),
          col = _tbl.Address._fromCol + Position;

      if (fromRow <= toRow) {
        _tbl.WorkSheet.Cells[fromRow, col, toRow, col].StyleName = value;
      }
    }
  }

  private const string _calculatedcolumnformulaPath = "d:calculatedColumnFormula";

  /// <summary>
  /// Sets a calculated column Formula.
  /// Be carefull with this property since it is not validated.
  /// <example>
  /// tbl.Columns[9].CalculatedColumnFormula = string.Format("SUM(MyDataTable[[#This Row],[{0}]])",tbl.Columns[9].Name);
  /// </example>
  /// </summary>
  public string CalculatedColumnFormula {
    get => GetXmlNodeString(_calculatedcolumnformulaPath);
    set {
      if (value.StartsWith("=")) {
        value = value.Substring(1, value.Length - 1);
      }
      SetXmlNodeString(_calculatedcolumnformulaPath, value);
    }
  }
}
