// 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:convert';
import 'dart:io';

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

import 'logger.dart';

export 'logger.dart';

/// Reads the digest inside of [workDirectory], sending tests to
/// [skiaGoldClient].
Future<void> harvest(
    SkiaGoldClient skiaGoldClient, Directory workDirectory) async {
  await skiaGoldClient.auth();

  final File digest = File(p.join(workDirectory.path, 'digest.json'));
  if (!digest.existsSync()) {
    Logger.instance
        .log('Error: digest.json does not exist in ${workDirectory.path}.');
    return;
  }
  final Object? decoded = jsonDecode(digest.readAsStringSync());
  final List<Object?> entries = (decoded as List<Object?>?)!;
  final List<Future<void>> pendingComparisons = <Future<void>>[];
  for (final Object? entry in entries) {
    final Map<String, Object?> map = (entry as Map<String, Object?>?)!;
    final String filename = (map['filename'] as String?)!;
    final int width = (map['width'] as int?)!;
    final int height = (map['height'] as int?)!;
    final double maxDiffPixelsPercent = (map['maxDiffPixelsPercent'] as double?)!;
    final int maxColorDelta = (map['maxColorDelta'] as int?)!;
    final File goldenImage = File(p.join(workDirectory.path, filename));
    final Future<void> future = skiaGoldClient
        .addImg(filename, goldenImage,
            screenshotSize: width * height, differentPixelsRate: maxDiffPixelsPercent, pixelColorDelta: maxColorDelta)
        .catchError((dynamic err) {
      Logger.instance.log('skia gold comparison failed: $err');
      throw Exception('Failed comparison: $filename');
    });
    pendingComparisons.add(future);
  }

  await Future.wait(pendingComparisons);
}
