/*******************************************************************************
 * 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.Immutable;
using System.IO;
using System.IO.Compression;
using System.Runtime.InteropServices;

namespace AppsheetEpplus;

internal class ZipPackagePart : ZipPackageRelationshipBase, IDisposable {
  internal ZipPackagePart(ZipPackage package, ZipArchiveEntry entry, ImmutableArray<byte> data) {
    Package = package;
    SaveHandler = null;
    Uri = new(package.GetUriKey(entry.FullName), UriKind.Relative);
    _data = data;
  }

  private readonly ImmutableArray<byte> _data;

  internal ZipPackagePart(
      ZipPackage package,
      Uri partUri,
      string contentType,
      Action<StreamWriter> saveHandler) {
    Package = package;
    Uri = partUri;
    ContentType = contentType;
    SaveHandler = saveHandler;
  }

  private ZipPackage Package { get; }

  internal override ZipPackageRelationship CreateRelationship(
      Uri targetUri,
      TargetMode targetMode,
      string relationshipType) {
    var rel = base.CreateRelationship(targetUri, targetMode, relationshipType);
    rel.SourceUri = Uri;
    return rel;
  }

  internal MemoryStream GetStream() {
    return new(ImmutableCollectionsMarshal.AsArray(_data) ?? [], false);
  }

  private string _contentType = "";

  public string ContentType {
    get => _contentType;
    internal set {
      if (!string.IsNullOrEmpty(_contentType)) {
        if (Package._contentTypes.ContainsKey(Package.GetUriKey(Uri.OriginalString))) {
          Package._contentTypes.Remove(Package.GetUriKey(Uri.OriginalString));
          Package._contentTypes.Add(
              Package.GetUriKey(Uri.OriginalString),
              new(value, false, Uri.OriginalString));
        }
      }
      _contentType = value;
    }
  }

  public Uri Uri { get; }

  internal Action<StreamWriter> SaveHandler { get; set; }

  internal void WriteZip(ZipArchive zipArchive) {
    if (SaveHandler == null) {
      if (_data.Length == 0) {
        return;
      }
      var zipEntry = zipArchive.CreateEntry(Uri.OriginalString);
      using var os = zipEntry.Open();
      os.Write(_data.AsSpan());
    } else {
      var zipEntry = zipArchive.CreateEntry(Uri.OriginalString);
      using var streamWriter = new StreamWriter(zipEntry.Open());
      SaveHandler(streamWriter);
    }

    if (_rels.Count > 0) {
      string f = Uri.OriginalString;
      var name = Path.GetFileName(f);
      _rels.WriteZip(zipArchive, $"{f.Substring(0, f.Length - name.Length)}_rels/{name}.rels");
    }
  }

  public void Dispose() {}
}
