﻿/*******************************************************************************
 * 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 OfficeOpenXml.Table.PivotTable;

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

  internal ExcelPivotTableCollection(ExcelWorksheet ws) {
    var pck = ws._package.Package;
    _ws = 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);
      }
    }
  }

  private ExcelPivotTable Add(ExcelPivotTable tbl) {
    _pivotTables.Add(tbl);
    _pivotTableNames.Add(tbl.Name, _pivotTables.Count - 1);
    if (tbl.CacheID >= _ws.Workbook._nextPivotTableID) {
      _ws.Workbook._nextPivotTableID = tbl.CacheID + 1;
    }
    return tbl;
  }

  /// <summary>
  /// Create a pivottable on the supplied range
  /// </summary>
  /// <param name="range">The range address including header and total row</param>
  /// <param name="source">The Source data range address</param>
  /// <param name="name">The name of the table. Must be unique </param>
  /// <returns>The pivottable object</returns>
  public ExcelPivotTable Add(ExcelAddressBase range, ExcelRangeBase source, string name) {
    if (string.IsNullOrEmpty(name)) {
      name = GetNewTableName();
    }
    if (range.WorkSheet != _ws.Name) {
      throw (new("The Range must be in the current worksheet"));
    }
    if (_ws.Workbook.ExistsTableName(name)) {
      throw (new ArgumentException("Tablename is not unique"));
    }
    foreach (var t in _pivotTables) {
      if (t.Address.Collide(range) != ExcelAddressBase.eAddressCollition.No) {
        throw (new ArgumentException(string.Format("Table range collides with table {0}", t.Name)));
      }
    }
    return Add(new(_ws, range, source, name, _ws.Workbook._nextPivotTableID++));
  }

  internal string GetNewTableName() {
    string name = "Pivottable1";
    int i = 2;
    while (_ws.Workbook.ExistsPivotTableName(name)) {
      name = string.Format("Pivottable{0}", i++);
    }
    return name;
  }

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