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

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

  [TestMethod]
  public void TestGetAsByteArray_DataValidation() {
    var package = new ExcelPackage(new FileInfo(GetTestWorkbookPath("DataValidation.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("Sheet1");
    worksheet.DataValidations.Should().HaveCount(31);
    worksheet.DataValidations[1].ValidationType.Should().Be(ExcelDataValidationType.Whole);
  }

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