/*******************************************************************************
 * 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.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;

namespace AppsheetEpplus;

/// <summary>
/// A collection of table columns
/// </summary>
public class ExcelTableColumnCollection : IEnumerable<ExcelTableColumn> {
  private readonly List<ExcelTableColumn> _cols = new();
  private readonly Dictionary<string, int> _colNames = new(
      StringComparer.InvariantCultureIgnoreCase);

  public ExcelTableColumnCollection(ExcelTable table) {
    Table = table;
    foreach (XmlNode node in table.TableXml.SelectNodes(
        "//d:table/d:tableColumns/d:tableColumn",
        table.NameSpaceManager)) {
      _cols.Add(new(table.NameSpaceManager, node, table, _cols.Count));
      _colNames.Add(_cols[_cols.Count - 1].Name, _cols.Count - 1);
    }
  }

  /// <summary>
  /// A reference to the table object
  /// </summary>
  public ExcelTable Table { get; private set; }

  /// <summary>
  /// Number of items in the collection
  /// </summary>
  public int Count => _cols.Count;

  /// <summary>
  /// The column Index. Base 0.
  /// </summary>
  /// <param name="index"></param>
  /// <returns></returns>
  public ExcelTableColumn this[int index] {
    get {
      if (index < 0 || index >= _cols.Count) {
        throw (new ArgumentOutOfRangeException("Column index out of range"));
      }
      return _cols[index];
    }
  }

  /// <summary>
  /// Indexer
  /// </summary>
  /// <param name="name">The name of the table</param>
  /// <returns>The table column. Null if the table name is not found in the collection</returns>
  public ExcelTableColumn this[string name] {
    get {
      if (_colNames.ContainsKey(name)) {
        return _cols[_colNames[name]];
      }
      return null;
    }
  }

  IEnumerator<ExcelTableColumn> IEnumerable<ExcelTableColumn>.GetEnumerator() {
    return _cols.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return _cols.GetEnumerator();
  }

  internal string GetUniqueName(string name) {
    if (_colNames.ContainsKey(name)) {
      string newName;
      var i = 2;
      do {
        newName = name + (i++).ToString(CultureInfo.InvariantCulture);
      } while (_colNames.ContainsKey(newName));
      return newName;
    }
    return name;
  }
}
