// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:io' as io;
import 'dart:math';

import 'package:flutter_driver/flutter_driver.dart';
import 'package:image/image.dart';
// TODO(yjbanov): this depends on integration_test that's not null-safe yet
//                https://github.com/flutter/flutter/issues/84014
// ignore: import_of_legacy_library_into_null_safe
import 'package:integration_test/integration_test_driver_extended.dart' as test;
import 'package:web_test_utils/goldens.dart';
import 'package:web_test_utils/image_compare.dart';

/// Tolerable pixel difference ratio between the goldens and the screenshots.
///
/// We are allowing a higher difference rate compared to the unit tests (where
/// this rate is set to 0.28), since during the end to end tests there are
/// more components on the screen which are not related to the functionality
/// under test ex: a blinking cursor.
// TODO(nurhan): canvaskit tests results have around 1.5 mismatch.
// Investigate possible solutions.
const double kMaxDiffRateFailure = 1.8 / 100; // 0.5%

/// SBrowser screen dimensions for the Flutter Driver test.
const int _kScreenshotWidth = 1024;
const int _kScreenshotHeight = 1024;

/// Used for calling `integration_test` package.
///
/// Compared to other similar classes which only included the following call:
/// ```
/// Future<void> main() async => test.integrationDriver();
/// ```
///
/// this method is able to take screenshot.
///
/// It provides an `onScreenshot` callback to the `integrationDriver` method.
/// It also includes options for updating the golden files.
Future<void> runTestWithScreenshots(
    {double diffRateFailure = kMaxDiffRateFailure,
    int browserWidth = _kScreenshotWidth,
    int browserHeight = _kScreenshotHeight}) async {
  final WebFlutterDriver driver =
      await FlutterDriver.connect() as WebFlutterDriver;

  // Learn the browser in use from the webDriver.
  final String browser = driver.webDriver.capabilities['browserName'] as String;

  (await driver.webDriver.window).setSize(Rectangle<int>(0, 0, browserWidth, browserHeight));

  bool updateGoldens = false;
  // We are using an environment variable instead of an argument, since
  // this code is not invoked from the shell but from the `flutter drive`
  // tool itself, we do not have control on the command line arguments.
  // Please read the README, further info on how to update the goldens.
  final String? updateGoldensFlag = io.Platform.environment['UPDATE_GOLDENS'];
  // Validate if the environment variable is set correctly.
  if (updateGoldensFlag != null &&
      !(updateGoldensFlag.toLowerCase() == 'true' ||
          updateGoldensFlag.toLowerCase() == 'false')) {
    throw StateError(
        'UPDATE_GOLDENS environment variable is not set correctly');
  }
  if (updateGoldensFlag != null && updateGoldensFlag.toLowerCase() == 'true') {
    updateGoldens = true;
  }

  test.integrationDriver(
    driver: driver,
    onScreenshot: (String screenshotName, List<int> screenshotBytes) async {
      final Image screenshot = decodePng(screenshotBytes)!;
      final String result = compareImage(
        screenshot,
        updateGoldens,
        '$screenshotName-$browser.png',
        PixelComparison.fuzzy,
        diffRateFailure,
        write: updateGoldens,
      );
      if (result == 'OK') {
        return true;
      } else {
        io.stderr.writeln('ERROR: $result');
        return false;
      }
    },
  );
}
