import 'package:flutter_test/flutter_test.dart';
import 'package:garden_planner/logic/date.helper.dart';

void main() {
  test('DateHelper isDateBetween should work in the same year', () {
    final dateBetween = DateTime(2023, 6, 15);
    final dateOutside = DateTime(2023, 7, 15);
    final from = DateTime(2023, 6, 1);
    final until = DateTime(2023, 6, 30);

    final resultTrue = DateHelper.isDateBetween(dateBetween, from, until);
    final resultFalse = DateHelper.isDateBetween(dateOutside, from, until);

    expect(resultTrue, true, reason: 'Date is beetween but returns true');
    expect(resultFalse, false, reason: 'Date is outside but returns false');
  });

  test('DateHelper isDateBetween should work with differnet  year', () {
    final dateBetween = DateTime(2020, 6, 15);
    final dateOutside = DateTime(2021, 7, 15);
    final from = DateTime(2022, 6, 1);
    final until = DateTime(2023, 6, 30);

    final resultTrue = DateHelper.isDateBetween(dateBetween, from, until);
    final resultFalse = DateHelper.isDateBetween(dateOutside, from, until);

    expect(resultTrue, true, reason: 'Date is beetween but returns true');
    expect(resultFalse, false, reason: 'Date is outside but returns false');
  });

  test('DateHelper isDateBetween should work with extremValues', () {
    final dateOutside1 = DateTime(2020, 6, 1);
    final dateOutside2 = DateTime(2021, 6, 31);
    final dateBetween1 = DateTime(2020, 6, 2);
    final dateBetween2 = DateTime(2021, 6, 30);
    final from = DateTime(2022, 6, 2);
    final until = DateTime(2023, 6, 30);

    final resultFalse1 = DateHelper.isDateBetween(dateOutside1, from, until);
    final resultFalse2 = DateHelper.isDateBetween(dateOutside2, from, until);
    final resultTrue1 = DateHelper.isDateBetween(dateBetween1, from, until);
    final resultTrue2 = DateHelper.isDateBetween(dateBetween2, from, until);

    expect(resultTrue1, true,
        reason: 'dateBetween1 is between but returns false');
    expect(resultTrue2, true,
        reason: 'dateBetween2 is between but returns false');
    expect(resultFalse1, false,
        reason: 'dateOutside1 is outside but returns true');
    expect(resultFalse2, false,
        reason: 'dateOutside2 is outside but returns true');
  });

  test('getDateTimeByDayOfYear returns the correct date', () {
    const dayOfYear = 40;
    final expectedDate = DateTime(2023, 2, 9);

    final result = DateHelper.getDateTimeByDayOfYear(dayOfYear);

    expect(result, expectedDate,
        reason: "The 40 day should be the 9th february");
  });

  test('getDayOfYear returns the correct day of the year', () {
    final date = DateTime(2000, 2, 9);
    const expectedDayOfYear = 40;

    final result = DateHelper.getDayOfYear(date);

    expect(result, expectedDayOfYear,
        reason: "The 9th february should be the 40 day");
  });

  test('getDateTimeByDate returns the correct date', () {
    final date = DateTime(2020, 6, 15);
    final expectedDate = DateTime(2023, 6, 15);

    final result = DateHelper.transformToCurrentYear(date);

    expect(result, expectedDate);
  });
}
