/*******************************************************************************
 * 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 readonly List<ExcelParagraph> _list = new();
  private readonly 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 document) {
      doc = document;
    } 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();
  }
}
