/*******************************************************************************
 * 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.IO;
using System.Xml;

namespace AppsheetEpplus;

internal abstract class ZipPackageRelationshipBase {
  protected ZipPackageRelationshipCollection _rels = new();
  protected internal int maxRId = 1;

  internal void DeleteRelationship(string id) {
    _rels.Remove(id);
    UpdateMaxRId(id, ref maxRId);
  }

  protected void UpdateMaxRId(string id, ref int maxRId) {
    if (id.StartsWith("rId")) {
      if (int.TryParse(id.Substring(3), out var num)) {
        if (num == maxRId - 1) {
          maxRId--;
        }
      }
    }
  }

  internal virtual ZipPackageRelationship CreateRelationship(
      Uri targetUri,
      TargetMode targetMode,
      string relationshipType) {
    var rel = new ZipPackageRelationship();
    rel.TargetUri = targetUri;
    rel.TargetMode = targetMode;
    rel.RelationshipType = relationshipType;
    rel.Id = "rId" + (maxRId++);
    _rels.Add(rel);
    return rel;
  }

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

  internal ZipPackageRelationshipCollection GetRelationshipsByType(string schema) {
    return _rels.GetRelationshipsByType(schema);
  }

  internal ZipPackageRelationshipCollection GetRelationships() {
    return _rels;
  }

  internal ZipPackageRelationship GetRelationship(string id) {
    return _rels[id];
  }

  internal void ReadRelation(Stream inputStream, string source) {
    var doc = new XmlDocument();
    XmlHelper.LoadXmlSafe(doc, inputStream);

    foreach (XmlElement c in doc.DocumentElement.ChildNodes) {
      var rel = new ZipPackageRelationship();
      rel.Id = c.GetAttribute("Id");
      rel.RelationshipType = c.GetAttribute("Type");
      rel.TargetMode = c.GetAttribute("TargetMode")
          .Equals("external", StringComparison.InvariantCultureIgnoreCase)
          ? TargetMode.External
          : TargetMode.Internal;
      try {
        rel.TargetUri = new(c.GetAttribute("Target"), UriKind.RelativeOrAbsolute);
      } catch {
        //The URI is not a valid URI. Encode it to make i valid.
        rel.TargetUri = new(
            Uri.EscapeUriString("Invalid:URI " + c.GetAttribute("Target")),
            UriKind.RelativeOrAbsolute);
      }
      if (!string.IsNullOrEmpty(source)) {
        rel.SourceUri = new(source, UriKind.Relative);
      }
      if (rel.Id.StartsWith("rid", StringComparison.InvariantCultureIgnoreCase)) {
        if (int.TryParse(rel.Id.Substring(3), out var id)) {
          if (id >= maxRId
              && id
                  < int.MaxValue
                      - 10000) //Not likly to have this high id's but make sure we have space to avoid overflow.
          {
            maxRId = id + 1;
          }
        }
      }
      _rels.Add(rel);
    }
  }
}
