/*******************************************************************************
 * 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;

namespace AppsheetEpplus;

/// <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);
    }
  }
}
