using System.IO;
using System.Linq;
using AppsheetEpplus;
using AwesomeAssertions;
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);
  }
}
