﻿/*******************************************************************************
 * 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		21-MAR-2011
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 *******************************************************************************/

using System;
using System.Collections;
using System.Collections.Generic;

namespace AppsheetEpplus;

/// <summary>
/// A collection of pivottable objects
/// </summary>
public class ExcelPivotTableCollection : IEnumerable<ExcelPivotTable> {
  private readonly List<ExcelPivotTable> _pivotTables = new();
  internal readonly Dictionary<string, int> _pivotTableNames = new();

  internal ExcelPivotTableCollection(ExcelWorksheet ws) {
    foreach (var rel in ws.Part.GetRelationships()) {
      if (rel.RelationshipType == ExcelPackage._schemaRelationships + "/pivotTable") {
        var tbl = new ExcelPivotTable(rel, ws);
        _pivotTableNames.Add(tbl.Name, _pivotTables.Count);
        _pivotTables.Add(tbl);
      }
    }
  }

  public int Count => _pivotTables.Count;

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

  /// <summary>
  /// Pivottabes accesed by name
  /// </summary>
  /// <param name="name">The name of the pivottable</param>
  /// <returns>The Pivotable. Null if the no match is found</returns>
  public ExcelPivotTable this[string name] {
    get {
      if (_pivotTableNames.ContainsKey(name)) {
        return _pivotTables[_pivotTableNames[name]];
      }
      return null;
    }
  }

  public IEnumerator<ExcelPivotTable> GetEnumerator() {
    return _pivotTables.GetEnumerator();
  }

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