/*******************************************************************************
 * 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 OfficeOpenXml.Packaging;

public 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);
    }
  }
}
