/*******************************************************************************
 * 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		25-Oct-2012
 *******************************************************************************/

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Security;

namespace OfficeOpenXml.Packaging;

internal class ZipPackageRelationshipCollection : IEnumerable<ZipPackageRelationship> {
  protected internal Dictionary<string, ZipPackageRelationship> _rels = new(
      StringComparer.InvariantCultureIgnoreCase);

  internal void Add(ZipPackageRelationship item) {
    _rels.Add(item.Id, item);
  }

  public IEnumerator<ZipPackageRelationship> GetEnumerator() {
    return _rels.Values.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return _rels.Values.GetEnumerator();
  }

  internal void Remove(string id) {
    _rels.Remove(id);
  }

  internal bool ContainsKey(string id) {
    return _rels.ContainsKey(id);
  }

  internal ZipPackageRelationship this[string id] => _rels[id];

  internal ZipPackageRelationshipCollection GetRelationshipsByType(string relationshipType) {
    var ret = new ZipPackageRelationshipCollection();
    foreach (var rel in _rels.Values) {
      if (rel.RelationshipType == relationshipType) {
        ret.Add(rel);
      }
    }
    return ret;
  }

  internal void WriteZip(ZipArchive zipArchive, string filename) {
    var entry = zipArchive.CreateEntry(filename);
    using var writer = new StreamWriter(entry.Open());

    writer.Write(
        "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
    foreach (var rel in _rels.Values) {
      writer.Write(
          "<Relationship Id=\"{0}\" Type=\"{1}\" Target=\"{2}\"{3}/>",
          SecurityElement.Escape(rel.Id),
          rel.RelationshipType,
          SecurityElement.Escape(rel.TargetUri.OriginalString),
          rel.TargetMode == TargetMode.External ? " TargetMode=\"External\"" : "");
    }
    writer.Write("</Relationships>");
  }

  public int Count => _rels.Count;
}
