import React = require('react');
import PageRenderer from '../../../../amis-core/src/renderers/Form';
import * as renderer from 'react-test-renderer';
import {
  render,
  screen,
  fireEvent,
  cleanup,
  getByText
} from '@testing-library/react';
import '../../../src';
import {render as amisRender} from '../../../src';
import {makeEnv, wait} from '../../helper';
import moment from 'moment';

test('Renderer:datetime', async () => {
  const {container} = render(
    amisRender(
      {
        type: 'form',
        api: '/api/xxx',
        controls: [
          {
            type: 'datetime',
            name: 'a',
            label: 'date',
            value: '1559826660',
            minDate: '1559664000',
            maxDate: '1561737600'
          }
        ],
        title: 'The form',
        actions: []
      },
      {},
      makeEnv({})
    )
  );

  const input = container.querySelector(
    '.cxd-DatePicker input'
  )! as HTMLInputElement;

  expect(input.value).toEqual(
    moment(1559826660, 'X').format('YYYY-MM-DD HH:mm:ss')
  );

  expect(container).toMatchSnapshot();
});

test('Renderer:datetime displayFormat valueFormat', async () => {
  const {container} = render(
    amisRender(
      {
        type: 'form',
        api: '/api/xxx',
        controls: [
          {
            type: 'datetime',
            name: 'b',
            label: 'datetime',
            value: '1559826660',
            displayFormat: 'YYYY/MM/DD HH:mm:ss',
            minDate: '1559664000',
            maxDate: '1561737600'
          }
        ],
        title: 'The form',
        actions: []
      },
      {},
      makeEnv({})
    )
  );

  const input = container.querySelector(
    '.cxd-DatePicker input'
  )! as HTMLInputElement;

  expect(input.value).toEqual(
    moment(1559826660, 'X').format('YYYY/MM/DD HH:mm:ss')
  );
});

/**
 * CASE: 日期时间选择器确认模式
 * 前提条件：
 *   - 当前组件为input-datetime类型
 *   - closeOnSelect为false
 *   - 未开启内嵌模式
 *   - 非移动端交互
 * 预期：
 *   1. 选择日期后，点击取消按钮，值重置
 *   2. 选择日期后，点击确定按钮，值更新
 */
test('Renderer:InputDateTime confirm mode', async () => {
  const {container} = render(
    amisRender({
      type: 'form',
      body: [
        {
          "name": "datetime",
          "label": "日期",
          "type": "input-datetime",
          "closeOnSelect": false
        }
      ],
      title: 'The form',
      actions: []
    }, {}, makeEnv({}))
  );

  const trigger = container.querySelector('.cxd-DatePicker')!;
  const inputEl = (container.querySelector(".cxd-DatePicker-input") as HTMLInputElement)!;
  const getCancelBtn = () => (container.querySelector('.cxd-DateRangePicker-actions > button[type=button]')!);
  const getConfirmBtn = () => (container.querySelector('.cxd-DateRangePicker-actions > .cxd-Button.cxd-Button--primary')!);
  expect(trigger).toBeInTheDocument();

  fireEvent.click(trigger);
  wait(200);
  /** 未选择新值，确认按钮禁用 */
  expect(getConfirmBtn()).toHaveClass('is-disabled');

  let todayEl = document.querySelector('.rdtDay.rdtToday')!;
  let yesterdayEl = todayEl?.previousSibling!;
  let tomorrowEl = todayEl?.nextSibling!;

  if (yesterdayEl) {
    fireEvent.click(yesterdayEl);
  }
  else {
    fireEvent.click(tomorrowEl);
  }
  wait(200);

  /** 选择日期之后禁用消失 */
  expect(getConfirmBtn()).not.toHaveClass('is-disabled');

  fireEvent.click(getCancelBtn());
  wait(200);
  /** 取消之后重置值 */
  expect(inputEl?.value).toEqual('');

  fireEvent.click(trigger);
  wait(200);

  todayEl = document.querySelector('.rdtDay.rdtToday')!;
  yesterdayEl = todayEl?.previousSibling!;
  tomorrowEl = todayEl?.nextSibling!;

  if (yesterdayEl) {
    fireEvent.click(yesterdayEl);
  }
  else {
    fireEvent.click(tomorrowEl);
  }
  wait(200);

  fireEvent.click(getConfirmBtn());
  wait(200);
  /** 确定之后有值 */
  expect(inputEl?.value).not.toEqual('');
}, 7000);

/**
 * CASE: 日期时间选择器首次选择日期或时间后，时间自动设置为当前时间
 * 前提条件：
 *   - 当前组件为input-datetime或者input-datetime-range类型
 *   - 当前组件未绑定值
 *   - 当前操作为首次编辑
 * 预期：
 *   1. 选择日期后，时间自动设置为当前时间
 *   2. 选择时间后（H、m、s），所选择时间为点选值，其他时间字段自动设置为当前时间
 *   3. 后续选择日期或者时间，不会改变点选值
 *   4. 如果为范围选择器，先选择结束时间，则开始时间不能超过结束时间
 */
test('Renderer:InputDateTime Picker selects date or time for the first time', async () => {
  const {container} = render(
    amisRender({
      type: 'form',
      body: [
        {
          "name": "datetime",
          "label": "日期",
          "type": "input-datetime",
          "valueFormat": "YYYY-MM-DD HH:mm:ss",
          "displayFormat": "YYYY-MM-DD HH:mm:ss",
          "closeOnSelect": false
        }
      ],
      title: 'The form',
      actions: []
    }, {}, makeEnv({}))
  );

  const trigger = container.querySelector('.cxd-DatePicker')!;
  const inputEl = (container.querySelector(".cxd-DatePicker-input") as HTMLInputElement)!;
  const getConfirmBtn = () => (container.querySelector('.cxd-DateRangePicker-actions > .cxd-Button.cxd-Button--primary')!);
  expect(trigger).toBeInTheDocument();

  fireEvent.click(trigger);
  wait(200);

  let todayEl = document.querySelector('.rdtDay.rdtToday')!;
  let yesterdayEl = todayEl?.previousSibling!;
  let tomorrowEl = todayEl?.nextSibling!;

  const currentTime = new Date();
  const currentSeconds = currentTime.getSeconds();

  /** 跳过0秒，用于后续测试值和00:00:00的Diff */
  if (currentSeconds === 0) {
    wait(1000);
  }

  if (yesterdayEl) {
    fireEvent.click(yesterdayEl);
  }
  else {
    fireEvent.click(tomorrowEl);
  }
  wait(200);
  const timeStr = inputEl?.value?.split(/\s+/)?.[1];
  /** 时间值设置为当前时间 */
  expect(timeStr !== '00:00:00').toEqual(true);

  fireEvent.click(todayEl);
  wait(200);
  const newTimeStr = inputEl?.value?.split(/\s+/)?.[1];
  /** 切换日期后时间不会再变 */
  expect(newTimeStr === timeStr).toEqual(true);
}, 7000);
