/**
 * TEAM: frontend_infra
 * @flow
 */
import * as React from "react";
// TODO: Fix this eslint issue on next edit. This is an autogenerated comment.
// eslint-disable-next-line flexport/no-legacy-dependencies
import {mount} from "enzyme";

import moment from "moment-timezone";
import {addDaysFromCalendarDate} from "../../date/CalendarDateType";
import {wallTime} from "../../date/wallTime";

import DateTimeRangeFilter from "../DateTimeRangeFilter";

process.on("unhandledRejection", reason => {
  // eslint-disable-next-line no-console
  console.error(
    "[UnhandledPromiseRejection] This test generates exceptions due to incorrect use of enzyme and side effects.",
    reason
  );
});

// none of our tests depend on a specific time zone or time
// unmock moment, since we will just be parsing one date
jest.unmock("moment");
jest.unmock("moment-timezone");

const timezone = moment.tz.guess();
const today = "2021-03-11T00:00:00.000Z";
const presets = [
  {
    label: "All time",
    startDate: {
      calendarDate: addDaysFromCalendarDate(today, -365),
      wallTime: wallTime("00:00:00.000"),
    },
    endDate: {
      calendarDate: addDaysFromCalendarDate(today, 365),
      wallTime: wallTime("00:00:00.000"),
    },
  },
  {
    label: "Last week",
    startDate: {
      calendarDate: addDaysFromCalendarDate(today, -7),
      wallTime: wallTime("00:00:00.000"),
    },
    endDate: {
      calendarDate: today,
      wallTime: wallTime("00:00:00.000"),
    },
  },
  {
    label: "Next month",
    startDate: {
      calendarDate: addDaysFromCalendarDate(today, -1),
      wallTime: wallTime("00:00:00.000"),
    },
    endDate: {
      calendarDate: addDaysFromCalendarDate(today, 30),
      wallTime: wallTime("00:00:00.000"),
    },
  },
];

function mountDateTimeRangeFilter(
  propOverrides: $Shape<React.ElementConfig<typeof DateTimeRangeFilter>>
) {
  return mount(
    <DateTimeRangeFilter
      label="DateTime Range"
      value={presets[1]}
      onChange={() => {}}
      presets={presets}
      timeZone={timezone}
      {...propOverrides}
    />
  );
}

describe("DateTimeRangeFilter", () => {
  const handleChange = jest.fn();
  const dateTimeRangeFilter = mountDateTimeRangeFilter({
    onChange: handleChange,
  });
  dateTimeRangeFilter.find("FilterButton").simulate("click");
  const dropDownOptions = dateTimeRangeFilter.find("DropdownOption");
  it("all presets are present plus custom", () => {
    expect(dropDownOptions.length).toBe(presets.length + 1);
  });
  it("can select a preset", () => {
    dropDownOptions.at(0).simulate("mousedown");
    expect(handleChange).toBeCalledWith({type: "preset", ...presets[0]});
  });
  it("can select custom filter", () => {
    dropDownOptions.last().simulate("mousedown");
    expect(handleChange).toBeCalled();
  });
  describe("custom footer is open", () => {
    const dateTimeRangeFilter = mountDateTimeRangeFilter({
      onChange: handleChange,
      value: {
        endDate: {
          calendarDate: "2021-03-11T00:00:00.000Z",
          wallTime: wallTime("00:00:00.000"),
        },
        startDate: {
          calendarDate: "2019-03-12T00:00:00.000Z",
          wallTime: wallTime("00:00:00.000"),
        },
        type: "custom",
      },
    });
    dateTimeRangeFilter.find("FilterButton").simulate("click");
    const customFooter = dateTimeRangeFilter.find("CustomRangeFooter");
    it("is open and has two Label fields present", () => {
      expect(customFooter.props().isOpen).toBeTruthy();
      expect(customFooter.find("Label").length).toBe(2);
    });
  });
});
