using System;
using System.IO;
using System.Linq;
using System.Text;
using AppsheetEpplus;
using AwesomeAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace NetCoreTests;

[TestClass]
public class TimeTest {
  static TimeTest() {
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  }

  [TestMethod]
  public void TestIncorrectDurationFromOaDate() {
    ExcelWorksheet.IncorrectDurationFromOaDate(2.75).Should().Be(new(1900, 1, 1, 18, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(1.75).Should().Be(new(1899, 12, 31, 18, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(0.75).Should().Be(new(1899, 12, 30, 18, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(0.5).Should().Be(new(1899, 12, 30, 12, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(0.25).Should().Be(new(1899, 12, 30, 6, 0, 0));

    ExcelWorksheet.IncorrectDurationFromOaDate(0).Should().Be(new(1899, 12, 30, 0, 0, 0));

    ExcelWorksheet.IncorrectDurationFromOaDate(-0.25).Should().Be(new(1899, 12, 29, 18, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(-0.5).Should().Be(new(1899, 12, 29, 12, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(-0.75).Should().Be(new(1899, 12, 29, 6, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(-1.75).Should().Be(new(1899, 12, 28, 6, 0, 0));
    ExcelWorksheet.IncorrectDurationFromOaDate(-2.75).Should().Be(new(1899, 12, 27, 6, 0, 0));
  }

  [TestMethod]
  public void TestDateParse() {
    var package = new ExcelPackage(new FileInfo(GetTestWorkbookPath("Times.xlsx")));
    var sheet = package.Workbook.Worksheets.First();

    sheet.Cells["B3"].Value.Should().Be(new DateTime(1899, 12, 30, 3, 15, 30));
    sheet.Cells["C3"].Value.Should().Be(new DateTime(1899, 12, 30, 3, 15, 0));
    sheet.Cells["D3"].Value.Should().Be(0.13541666666666666);
    sheet.Cells["E3"].Value.Should().Be(new DateTime(1899, 12, 30, 3, 15, 30));
    sheet.Cells["F3"].Value.Should().Be(0.13576388888888888);
    sheet.Cells["G3"].Value.Should().Be(0.13541666666666666);
    sheet.Cells["H3"].Value.Should().Be(new DateTime(1899, 12, 30, 3, 15, 30));

    sheet.Cells["B7"].Value.Should().Be(new DateTime(1899, 12, 30, 23, 59, 59));
    sheet.Cells["C7"].Value.Should().Be(new DateTime(1899, 12, 30, 23, 59, 0));
    sheet.Cells["D7"].Value.Should().Be(0.9993055555555556);
    sheet.Cells["E7"].Value.Should().Be(new DateTime(1899, 12, 30, 23, 59, 59));
    sheet.Cells["F7"].Value.Should().Be(0.999988425925926);
    sheet.Cells["G7"].Value.Should().Be(0.9993055555555556);
    sheet.Cells["H7"].Value.Should().Be(new DateTime(1899, 12, 30, 23, 59, 59));
  }

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