/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import * as sinon from 'sinon';
import {Timestamp} from '../types/common';
import '../test/common-test-setup';
import {
  isValidDate,
  parseDate,
  fromNow,
  isWithinDay,
  isWithinHalfYear,
  formatDate,
  wasYesterday,
} from './date-util';
import {assert} from '@open-wc/testing';

suite('date-util tests', () => {
  suite('parseDate', () => {
    test('parseDate server date', () => {
      const parsed = parseDate('2015-09-15 20:34:00.000000000' as Timestamp);
      assert.equal('2015-09-15T20:34:00.000Z', parsed.toISOString());
    });
  });

  suite('isValidDate', () => {
    test('date is valid', () => {
      assert.isTrue(isValidDate(new Date()));
    });
    test('broken date is invalid', () => {
      assert.isFalse(isValidDate(new Date('xxx')));
    });
  });

  suite('fromNow', () => {
    test('test all variants', () => {
      const fakeNow = new Date('May 08 2020 12:00:00');
      sinon.useFakeTimers(fakeNow.getTime());
      assert.equal('just now', fromNow(new Date('May 08 2020 11:59:30')));
      assert.equal('1 minute ago', fromNow(new Date('May 08 2020 11:59:00')));
      assert.equal('5 minutes ago', fromNow(new Date('May 08 2020 11:55:00')));
      assert.equal('1 hour ago', fromNow(new Date('May 08 2020 11:00:00')));
      assert.equal(
        '1 hour 5 min ago',
        fromNow(new Date('May 08 2020 10:55:00'))
      );
      assert.equal('3 hours ago', fromNow(new Date('May 08 2020 9:00:00')));
      assert.equal('1 day ago', fromNow(new Date('May 07 2020 12:00:00')));
      assert.equal('1 day 2 hr ago', fromNow(new Date('May 07 2020 10:00:00')));
      assert.equal('3 days ago', fromNow(new Date('May 05 2020 12:00:00')));
      assert.equal('1 month ago', fromNow(new Date('Apr 05 2020 12:00:00')));
      assert.equal('2 months ago', fromNow(new Date('Mar 05 2020 12:00:00')));
      assert.equal('1 year ago', fromNow(new Date('May 05 2019 12:00:00')));
      assert.equal('10 years ago', fromNow(new Date('May 05 2010 12:00:00')));
    });
    test('rounding error', () => {
      const fakeNow = new Date('May 08 2020 12:00:00');
      sinon.useFakeTimers(fakeNow.getTime());
      assert.equal('2 hours ago', fromNow(new Date('May 08 2020 9:30:00')));
    });
  });

  suite('isWithinDay', () => {
    test('basics works', () => {
      assert.isTrue(
        isWithinDay(
          new Date('May 08 2020 12:00:00'),
          new Date('May 08 2020 02:00:00')
        )
      );
      assert.isFalse(
        isWithinDay(
          new Date('May 08 2020 12:00:00'),
          new Date('May 07 2020 12:00:00')
        )
      );
    });
  });

  suite('wasYesterday', () => {
    test('less 24 hours', () => {
      assert.isFalse(
        wasYesterday(
          new Date('May 08 2020 12:00:00'),
          new Date('May 08 2020 02:00:00')
        )
      );
      assert.isTrue(
        wasYesterday(
          new Date('May 08 2020 12:00:00'),
          new Date('May 07 2020 12:00:00')
        )
      );
    });
    test('more 24 hours', () => {
      assert.isTrue(
        wasYesterday(
          new Date('May 08 2020 12:00:00'),
          new Date('May 07 2020 2:00:00')
        )
      );
      assert.isFalse(
        wasYesterday(
          new Date('May 08 2020 12:00:00'),
          new Date('May 06 2020 14:00:00')
        )
      );
    });
  });

  suite('isWithinHalfYear', () => {
    test('basics works', () => {
      assert.isTrue(
        isWithinHalfYear(
          new Date('May 08 2020 12:00:00'),
          new Date('Feb 08 2020 12:00:00')
        )
      );
      assert.isFalse(
        isWithinHalfYear(
          new Date('May 08 2020 12:00:00'),
          new Date('Nov 07 2019 12:00:00')
        )
      );
    });
  });

  suite('formatDate', () => {
    test('works for standard format', () => {
      const stdFormat = 'MMM DD, YYYY';
      assert.equal(
        'May 08, 2020',
        formatDate(new Date('May 08 2020 12:00:00'), stdFormat)
      );
      assert.equal(
        'Feb 28, 2020',
        formatDate(new Date('Feb 28 2020 12:00:00'), stdFormat)
      );

      const time24Format = 'HH:mm:ss';
      assert.equal(
        'Feb 28, 2020 12:01:12',
        formatDate(
          new Date('Feb 28 2020 12:01:12'),
          stdFormat + ' ' + time24Format
        )
      );
    });
    test('works for euro format', () => {
      const euroFormat = 'DD.MM.YYYY';
      assert.equal(
        '01.12.2019',
        formatDate(new Date('Dec 01 2019 12:00:00'), euroFormat)
      );
      assert.equal(
        '20.01.2002',
        formatDate(new Date('Jan 20 2002 12:00:00'), euroFormat)
      );

      const time24Format = 'HH:mm:ss';
      assert.equal(
        '28.02.2020 00:01:12',
        formatDate(
          new Date('Feb 28 2020 00:01:12'),
          euroFormat + ' ' + time24Format
        )
      );
    });
    test('works for iso format', () => {
      const isoFormat = 'YYYY-MM-DD';
      assert.equal(
        '2015-01-01',
        formatDate(new Date('Jan 01 2015 12:00:00'), isoFormat)
      );
      assert.equal(
        '2013-07-03',
        formatDate(new Date('Jul 03 2013 12:00:00'), isoFormat)
      );

      const timeFormat = 'h:mm:ss A';
      assert.equal(
        '2013-07-03 5:00:00 AM',
        formatDate(
          new Date('Jul 03 2013 05:00:00'),
          isoFormat + ' ' + timeFormat
        )
      );
      assert.equal(
        '2013-07-03 5:00:00 PM',
        formatDate(
          new Date('Jul 03 2013 17:00:00'),
          isoFormat + ' ' + timeFormat
        )
      );
    });

    test('weekday', () => {
      assert.equal(
        '2013-07-03 Wed',
        formatDate(new Date('Jul 03 2013 12:14:00'), 'YYYY-MM-DD ddd')
      );
      assert.equal(
        '2013-07-03 Wednesday',
        formatDate(new Date('Jul 03 2013 00:15:00'), 'YYYY-MM-DD dddd')
      );
    });

    test('h:mm:ss A shows correctly midnight and midday', () => {
      const timeFormat = 'h:mm A';
      assert.equal(
        '12:14 PM',
        formatDate(new Date('Jul 03 2013 12:14:00'), timeFormat)
      );
      assert.equal(
        '12:15 AM',
        formatDate(new Date('Jul 03 2013 00:15:00'), timeFormat)
      );
    });
  });
});
