using System.Collections;
using System.Collections.Generic;
using System.Xml;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml;

public class ExcelProtectedRangeCollection : XmlHelper, IEnumerable<ExcelProtectedRange> {
  internal ExcelProtectedRangeCollection(
      XmlNamespaceManager nsm,
      XmlNode topNode,
      ExcelWorksheet ws)
      : base(nsm, topNode) {
    foreach (XmlNode protectedRangeNode in topNode.SelectNodes(
        "d:protectedRanges/d:protectedRange",
        nsm)) {
      if (!(protectedRangeNode is XmlElement)) {
        continue;
      }
      _baseList.Add(
          new(
              protectedRangeNode.Attributes["name"].Value,
              new(SqRefUtility.FromSqRefAddress(protectedRangeNode.Attributes["sqref"].Value)),
              nsm,
              topNode));
    }
  }

  private readonly List<ExcelProtectedRange> _baseList = new();

  public ExcelProtectedRange Add(string name, ExcelAddress address) {
    if (!ExistNode("d:protectedRanges")) {
      CreateNode("d:protectedRanges");
    }

    var newNode = CreateNode("d:protectedRanges/d:protectedRange");
    var item = new ExcelProtectedRange(name, address, NameSpaceManager, newNode);
    _baseList.Add(item);
    return item;
  }

  public void Clear() {
    DeleteNode("d:protectedRanges");
    _baseList.Clear();
  }

  public bool Contains(ExcelProtectedRange item) {
    return _baseList.Contains(item);
  }

  public void CopyTo(ExcelProtectedRange[] array, int arrayIndex) {
    _baseList.CopyTo(array, arrayIndex);
  }

  public int Count => _baseList.Count;

  public bool Remove(ExcelProtectedRange item) {
    DeleteAllNode(
        "d:protectedRanges/d:protectedRange[@name='"
            + item.Name
            + "' and @sqref='"
            + item.Address.Address
            + "']");
    if (_baseList.Count == 0) {
      DeleteNode("d:protectedRanges");
    }
    return _baseList.Remove(item);
  }

  public int IndexOf(ExcelProtectedRange item) {
    return _baseList.IndexOf(item);
  }

  public void RemoveAt(int index) {
    _baseList.RemoveAt(index);
  }

  public ExcelProtectedRange this[int index] => _baseList[index];

  IEnumerator<ExcelProtectedRange> IEnumerable<ExcelProtectedRange>.GetEnumerator() {
    return _baseList.GetEnumerator();
  }

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