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

namespace OfficeOpenXml.Table;

/// <summary>
/// A collection of table objects
/// </summary>
public class ExcelTableCollection : IEnumerable<ExcelTable> {
  private readonly List<ExcelTable> _tables = new();
  internal Dictionary<string, int> _tableNames = new(StringComparer.InvariantCultureIgnoreCase);
  private readonly ExcelWorksheet _ws;

  internal ExcelTableCollection(ExcelWorksheet ws) {
    var pck = ws._package.Package;
    _ws = ws;
    foreach (XmlElement node in ws.WorksheetXml.SelectNodes(
        "//d:tableParts/d:tablePart",
        ws.NameSpaceManager)) {
      var rel = ws.Part.GetRelationship(node.GetAttribute("id", ExcelPackage._schemaRelationships));
      var tbl = new ExcelTable(rel, ws);
      _tableNames.Add(tbl.Name, _tables.Count);
      _tables.Add(tbl);
    }
  }

  internal string GetNewTableName() {
    string name = "Table1";
    int i = 2;
    while (_ws.Workbook.ExistsTableName(name)) {
      name = string.Format("Table{0}", i++);
    }
    return name;
  }

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

  /// <summary>
  /// Get the table object from a range.
  /// </summary>
  /// <param name="range">The range</param>
  /// <returns>The table. Null if no range matches</returns>
  public ExcelTable GetFromRange(ExcelRangeBase range) {
    foreach (var tbl in range.Worksheet.Tables) {
      if (tbl.Address._address == range._address) {
        return tbl;
      }
    }
    return null;
  }

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

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

  public IEnumerator<ExcelTable> GetEnumerator() {
    return _tables.GetEnumerator();
  }

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