// 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';

import 'package:image/image.dart';
import 'package:path/path.dart' as p;
import 'package:skia_gold_client/skia_gold_client.dart';

/// Compares a screenshot taken through a test with its golden.
///
/// Used by Flutter Web Engine unit tests and the integration tests.
///
/// Returns the results of the tests as `String`. When tests passes the result
/// is simply `OK`, however when they fail it contains a detailed explanation
/// on which files are compared, their absolute locations and an HTML page
/// that the developer can see the comparison.
Future<String> compareImage(
  Image screenshot,
  bool doUpdateScreenshotGoldens,
  String filename,
  Directory suiteGoldenDirectory,
  SkiaGoldClient? skiaClient, {
  required bool isCanvaskitTest,
  required bool verbose,
}) async {
  if (skiaClient == null) {
    return 'OK';
  }

  final String screenshotPath = p.join(suiteGoldenDirectory.path, filename);
  final File screenshotFile = File(screenshotPath);
  await screenshotFile.create(recursive: true);
  await screenshotFile.writeAsBytes(encodePng(screenshot), flush: true);

  if (isLuciEnv) {
    // This is temporary to get started by uploading existing screenshots to
    // Skia Gold. The next step would be to actually use Skia Gold for
    // comparison.
    final int screenshotSize = screenshot.width * screenshot.height;

    final int pixelColorDeltaPerChannel;
    final double differentPixelsRate;

    if (isCanvaskitTest) {
      differentPixelsRate = 0.1;
      pixelColorDeltaPerChannel = 7;
    } else if (skiaClient.dimensions != null && skiaClient.dimensions!['Browser'] == 'ios-safari') {
      differentPixelsRate = 0.15;
      pixelColorDeltaPerChannel = 16;
    } else {
      differentPixelsRate = 0.1;
      pixelColorDeltaPerChannel = 1;
    }

    skiaClient.addImg(
      filename,
      screenshotFile,
      screenshotSize: screenshotSize,
      differentPixelsRate: differentPixelsRate,
      pixelColorDelta: pixelColorDeltaPerChannel * 3,
    );
    return 'OK';
  }

  final Image? golden = await _getGolden(filename);

  if (doUpdateScreenshotGoldens) {
    return 'OK';
  }

  if (golden == null) {
    // This is a new screenshot that doesn't have an existing golden.

    // At the moment, we don't support local screenshot testing because we use
    // Skia Gold to handle our screenshots and diffing. In the future, we might
    // implement local screenshot testing if there's a need.
    if (verbose) {
      print('Screenshot generated: file://$screenshotPath'); // ignore: avoid_print
    }
    return 'OK';
  }

  // TODO(mdebbar): Use the Gold tool to locally diff the golden.
  return 'OK';
}

Future<Image?> _getGolden(String filename) {
  // TODO(mdebbar): Fetch the golden from Skia Gold.
  return Future<Image?>.value();
}
