/*******************************************************************************
 * 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-16
 *******************************************************************************/

using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace OfficeOpenXml.Style;

/// <summary>
/// A collection of Paragraph objects
/// </summary>
public class ExcelParagraphCollection : XmlHelper, IEnumerable<ExcelParagraph> {
  private List<ExcelParagraph> _list = new();
  private string _path;

  internal ExcelParagraphCollection(
      XmlNamespaceManager ns,
      XmlNode topNode,
      string path,
      string[] schemaNodeOrder)
      : base(ns, topNode) {
    var nl = topNode.SelectNodes(path + "/a:r", NameSpaceManager);
    SchemaNodeOrder = schemaNodeOrder;
    if (nl != null) {
      foreach (XmlNode n in nl) {
        _list.Add(new(ns, n, "", schemaNodeOrder));
      }
    }
    _path = path;
  }

  public ExcelParagraph this[int index] => _list[index];

  public int Count => _list.Count;

  /// <summary>
  /// Add a rich text string
  /// </summary>
  /// <param name="text">The text to add</param>
  /// <returns></returns>
  public ExcelParagraph Add(string text) {
    XmlDocument doc;
    if (TopNode is XmlDocument) {
      doc = TopNode as XmlDocument;
    } else {
      doc = TopNode.OwnerDocument;
    }
    XmlNode parentNode = TopNode.SelectSingleNode(_path, NameSpaceManager);
    if (parentNode == null) {
      CreateNode(_path);
      parentNode = TopNode.SelectSingleNode(_path, NameSpaceManager);
    }

    var node = doc.CreateElement("a", "r", ExcelPackage._schemaDrawings);
    parentNode.AppendChild(node);
    var childNode = doc.CreateElement("a", "rPr", ExcelPackage._schemaDrawings);
    node.AppendChild(childNode);
    var rt = new ExcelParagraph(NameSpaceManager, node, "", SchemaNodeOrder);
    rt.ComplexFont = "Calibri";
    rt.LatinFont = "Calibri";
    rt.Size = 11;

    rt.Text = text;
    _list.Add(rt);
    return rt;
  }

  public void Clear() {
    _list.Clear();
    TopNode.RemoveAll();
  }

  public void RemoveAt(int index) {
    var node = _list[index].TopNode;
    while (node != null && node.Name != "a:r") {
      node = node.ParentNode;
    }
    node.ParentNode.RemoveChild(node);
    _list.RemoveAt(index);
  }

  public void Remove(ExcelRichText item) {
    TopNode.RemoveChild(item.TopNode);
  }

  public string Text {
    get {
      StringBuilder sb = new StringBuilder();
      foreach (var item in _list) {
        sb.Append(item.Text);
      }
      return sb.ToString();
    }
    set {
      if (Count == 0) {
        Add(value);
      } else {
        this[0].Text = value;
        int count = Count;
        for (int ix = Count - 1; ix > 0; ix--) {
          RemoveAt(ix);
        }
      }
    }
  }

  IEnumerator<ExcelParagraph> IEnumerable<ExcelParagraph>.GetEnumerator() {
    return _list.GetEnumerator();
  }

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