import { TimestampUtil } from "../DateTimeUtil";
import { INCLUDE_TIME_OFFSET, setSettings } from "../../../constants";

const timestamp = "2023-06-07T07:04:01.010+02:00";

describe("date time format conversion", () => {
  beforeEach(() => {
    TimestampUtil.setTimeZone("Europe/Amsterdam");
    setSettings({ [INCLUDE_TIME_OFFSET]: true });
  });

  test("Year", () => {
    expect(TimestampUtil.toFormat(timestamp, "yy")).toBe("23");
    expect(TimestampUtil.toFormat(timestamp, "yyyy")).toBe("2023");
  });

  test("Month", () => {
    expect(TimestampUtil.toFormat(timestamp, "M")).toBe("6");
    expect(TimestampUtil.toFormat(timestamp, "MM")).toBe("06");
    expect(TimestampUtil.toFormat(timestamp, "MMM")).toBe("Jun");
    expect(TimestampUtil.toFormat(timestamp, "MMMM")).toBe("June");
    expect(TimestampUtil.toFormat(timestamp, "MMMMM")).toBe("J");

    expect(TimestampUtil.toFormat(timestamp, "L")).toBe("6");
    expect(TimestampUtil.toFormat(timestamp, "LL")).toBe("06");
    expect(TimestampUtil.toFormat(timestamp, "LLL")).toBe("Jun");
    expect(TimestampUtil.toFormat(timestamp, "LLLL")).toBe("June");
    expect(TimestampUtil.toFormat(timestamp, "LLLLL")).toBe("J");
  });

  test("Day", () => {
    expect(TimestampUtil.toFormat(timestamp, "d")).toBe("7");
    expect(TimestampUtil.toFormat(timestamp, "dd")).toBe("07");
  });

  test("Quarter", () => {
    expect(TimestampUtil.toFormat(timestamp, "Q")).toBe("2");
    expect(TimestampUtil.toFormat(timestamp, "QQ")).toBe("02");
    expect(TimestampUtil.toFormat(timestamp, "QQQ")).toBe("Q2");
    expect(TimestampUtil.toFormat(timestamp, "QQQQ")).toBe("2nd quarter");
  });

  test("Day of Week", () => {
    expect(TimestampUtil.toFormat(timestamp, "E")).toBe("Wed");
    expect(TimestampUtil.toFormat(timestamp, "EEEE")).toBe("Wednesday");
    expect(TimestampUtil.toFormat(timestamp, "EEEEE")).toBe("W");

    expect(TimestampUtil.toFormat(timestamp, "e")).toBe("3");
    expect(TimestampUtil.toFormat(timestamp, "ee")).toBe("03");
    expect(TimestampUtil.toFormat(timestamp, "eee")).toBe("Wed");
    expect(TimestampUtil.toFormat(timestamp, "eeee")).toBe("Wednesday");
    expect(TimestampUtil.toFormat(timestamp, "eeeee")).toBe("W");
  });

  test("Week", () => {
    expect(TimestampUtil.toFormat(timestamp, "w")).toBe("23");
    // expect(TimestampUtil.toFormat(timestamp, "W")).toBe("23");
    // expect(TimestampUtil.toFormat(timestamp, "F")).toBe("W");
  });

  test("Hour", () => {
    expect(TimestampUtil.toFormat(timestamp, "H")).toBe("7");
    expect(TimestampUtil.toFormat(timestamp, "HH")).toBe("07");
    expect(TimestampUtil.toFormat(timestamp, "h")).toBe("7");
    expect(TimestampUtil.toFormat(timestamp, "hh")).toBe("07");

    expect(TimestampUtil.toFormat(timestamp, "a")).toBe("AM");
    expect(TimestampUtil.toFormat(timestamp, "aa")).toBe("AM");
    expect(TimestampUtil.toFormat(timestamp, "aaa")).toBe("am");
    expect(TimestampUtil.toFormat(timestamp, "aaaa")).toBe("a.m.");
    expect(TimestampUtil.toFormat(timestamp, "aaaaa")).toBe("a");

    expect(TimestampUtil.toFormat(timestamp, "K")).toBe("7");
    expect(TimestampUtil.toFormat(timestamp, "k")).toBe("7");
  });

  test("Minute", () => {
    expect(TimestampUtil.toFormat(timestamp, "m")).toBe("4");
    expect(TimestampUtil.toFormat(timestamp, "mm")).toBe("04");
  });

  test("Seconds", () => {
    expect(TimestampUtil.toFormat(timestamp, "s")).toBe("1");
    expect(TimestampUtil.toFormat(timestamp, "ss")).toBe("01");
  });

  test("Milliseconds", () => {
    expect(TimestampUtil.toFormat(timestamp, "SSS")).toBe("010");
  });

  test("Zone / offset", () => {
    expect(TimestampUtil.toFormat(timestamp, "z")).toBe("GMT+2");
    expect(TimestampUtil.toFormat(timestamp, "zz")).toBe("GMT+2");
    expect(TimestampUtil.toFormat(timestamp, "zzz")).toBe("GMT+2");
    expect(TimestampUtil.toFormat(timestamp, "zzzz")).toBe("GMT+02:00");
    expect(TimestampUtil.toFormat(timestamp, "zzzzz")).toBe("GMT+02:00");

    expect(TimestampUtil.toFormat(timestamp, "X")).toBe("+02");
    expect(TimestampUtil.toFormat(timestamp, "XX")).toBe("+0200");
    expect(TimestampUtil.toFormat(timestamp, "XXX")).toBe("+02:00");

    expect(TimestampUtil.toFormat(timestamp, "x")).toBe("+02");
    expect(TimestampUtil.toFormat(timestamp, "xx")).toBe("+0200");
    expect(TimestampUtil.toFormat(timestamp, "xxx")).toBe("+02:00");

    expect(TimestampUtil.toFormat(timestamp, "O")).toBe("GMT+2");
    expect(TimestampUtil.toFormat(timestamp, "OOOO")).toBe("GMT+02:00");

    // expect(TimestampUtil.toFormat(timestamp, "VV")).toBe("GMT+02:00");
    // expect(TimestampUtil.toFormat(timestamp, "V")).toBe("Europe/Amsterdam");
    // expect(TimestampUtil.toFormat(timestamp, "Z")).toBe("+02:00");
    // expect(TimestampUtil.toFormat(timestamp, "ZZZZ")).toBe("+02:00");
  });

  test("Era and Chronology", () => {
    expect(TimestampUtil.toFormat(timestamp, "G")).toBe("AD");
    expect(TimestampUtil.toFormat(timestamp, "GGGG")).toBe("Anno Domini");
    expect(TimestampUtil.toFormat(timestamp, "GGGGG")).toBe("A");

    expect(TimestampUtil.toFormat(timestamp, "u")).toBe("2023");
  });

  test("Converted", () => {
    const ZZZ = TimestampUtil.convertFormat("ZZZ");
    expect(TimestampUtil.toFormat(timestamp, ZZZ)).toBe("+02:00");

    const ZZ = TimestampUtil.convertFormat("ZZ");
    expect(TimestampUtil.toFormat(timestamp, ZZ)).toBe("+0200");

    const Z = TimestampUtil.convertFormat("Z");
    expect(TimestampUtil.toFormat(timestamp, Z)).toBe("+02");

    const fullDateTime = TimestampUtil.convertFormat(
      "EEE MMM dd, yyyy h:mma ZZ",
    );
    expect(TimestampUtil.toFormat(timestamp, fullDateTime)).toBe(
      "Wed Jun 07, 2023 7:04AM +0200",
    );
  });
});
