/*******************************************************************************
 * 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		    Initial Release		        2009-10-01
 * Jan Källman		    License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;

namespace OfficeOpenXml;

/// <summary>
/// Base collection class for styles.
/// </summary>
/// <typeparam name="T">The style type</typeparam>
public class ExcelStyleCollection<T> : IEnumerable<T> {
  public ExcelStyleCollection() {
    _setNextIdManual = false;
  }

  private readonly bool _setNextIdManual;

  public ExcelStyleCollection(bool setNextIdManual) {
    _setNextIdManual = setNextIdManual;
  }

  public XmlNode TopNode { get; set; }

  internal List<T> _list = new();
  private readonly Dictionary<string, int> _dic = new(StringComparer.InvariantCultureIgnoreCase);
  internal int NextId;

  public IEnumerator<T> GetEnumerator() {
    return _list.GetEnumerator();
  }

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

  public T this[int positionId] => _list[positionId];

  public int Count => _list.Count;

  //internal int Add(T item)
  //{
  //    _list.Add(item);
  //    if (_setNextIdManual) NextId++;
  //    return _list.Count-1;
  //}
  internal int Add(string key, T item) {
    _list.Add(item);
    if (!_dic.ContainsKey(key.ToLower(CultureInfo.InvariantCulture))) {
      _dic.Add(key.ToLower(CultureInfo.InvariantCulture), _list.Count - 1);
    }
    if (_setNextIdManual) {
      NextId++;
    }
    return _list.Count - 1;
  }

  /// <summary>
  /// Finds the key
  /// </summary>
  /// <param name="key">the key to be found</param>
  /// <param name="obj">The found object.</param>
  /// <returns>True if found</returns>
  internal bool FindById(string key, ref T obj) {
    if (_dic.ContainsKey(key)) {
      obj = _list[_dic[key.ToLower(CultureInfo.InvariantCulture)]];
      return true;
    }
    return false;
  }

  /// <summary>
  /// Find Index
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  internal int FindIndexById(string key) {
    if (_dic.ContainsKey(key)) {
      return _dic[key];
    }
    return int.MinValue;
  }

  internal bool ExistsKey(string key) {
    return _dic.ContainsKey(key);
  }

  internal void Sort(Comparison<T> c) {
    _list.Sort(c);
  }
}
