/*******************************************************************************
 * 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.IO.Compression;

namespace OfficeOpenXml.Packaging;

internal class ZipPackagePart : ZipPackageRelationshipBase, IDisposable {
  internal delegate void SaveHandlerDelegate(StreamWriter streamWriter);

  internal ZipPackagePart(ZipPackage package, ZipArchiveEntry entry) {
    Package = package;
    SaveHandler = null;
    Uri = new(package.GetUriKey(entry.FullName), UriKind.Relative);
  }

  internal ZipPackagePart(
      ZipPackage package,
      Uri partUri,
      string contentType,
      CompressionLevel compressionLevel) {
    Package = package;
    //Entry = new ZipEntry();
    //Entry.FileName = partUri.OriginalString.Replace('/','\\');
    Uri = partUri;
    ContentType = contentType;
    CompressionLevel = compressionLevel;
  }

  internal ZipPackage Package { get; set; }

  internal CompressionLevel CompressionLevel;
  private MemoryStream _stream;

  internal MemoryStream Stream {
    get => _stream;
    set => _stream = value;
  }

  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 GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite);
  }

  internal MemoryStream GetStream(FileMode fileMode) {
    return GetStream(FileMode.Create, FileAccess.ReadWrite);
  }

  internal MemoryStream GetStream(FileMode fileMode, FileAccess fileAccess) {
    if (_stream == null || fileMode == FileMode.CreateNew || fileMode == FileMode.Create) {
      _stream = new();
    } else {
      _stream.Seek(0, SeekOrigin.Begin);
    }
    return _stream;
  }

  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; private set; }

  internal SaveHandlerDelegate SaveHandler { get; set; }

  internal void WriteZip(ZipArchive zipArchive) {
    byte[] b;
    if (SaveHandler == null) {
      b = GetStream().ToArray();
      if (b.Length
          == 0) //Make sure the file isn't empty. DotNetZip streams does not seems to handle zero sized files.
      {
        return;
      }
      var zipEntry = zipArchive.CreateEntry(Uri.OriginalString);
      using var os = zipEntry.Open();
      os.Write(b);
    } 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");
    }
    b = null;
  }

  public void Dispose() {
    _stream.Close();
    _stream.Dispose();
  }
}
