using System.IO;
using System.Linq;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;

namespace NetCoreTests;

[TestClass]
public class ExcelPackageTest {
  [TestMethod]
  public void TestGetAsByteArray() {
    var package = new ExcelPackage(new FileInfo(GetTestWorkbookPath("Times.xlsx")));
    var data = package.GetAsByteArray();

    // Verify that we can reload
    var newPackage = new ExcelPackage(new MemoryStream(data, false));
    newPackage.Workbook.Worksheets.Count.Should().Be(1);
    var worksheet = newPackage.Workbook.Worksheets.First();
    worksheet.Name.Should().Be("Times_csv");
  }

  [TestMethod]
  public void TestGetAsByteArray_PublicLibrary() {
    var package = new ExcelPackage(new FileInfo(GetTestWorkbookPath("PublicLibrary.xlsx")));
    var data = package.GetAsByteArray();

    // Verify that we can reload
    var newPackage = new ExcelPackage(new MemoryStream(data, false));
    newPackage.Workbook.Worksheets.Count.Should().Be(1);
    var worksheet = newPackage.Workbook.Worksheets.First();
    worksheet.Name.Should().Be("pusum11a");
  }

  private static string GetTestWorkbookPath(string filename) {
    var assemblyPath = Path.GetDirectoryName(typeof(ExcelPackageTest).Assembly.Location)!;
    return Path.Combine(assemblyPath, "TestWorkbooks", filename);
  }
}
