// Copyright 2014 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.

// @dart = 2.8

import 'dart:convert';
import 'dart:io';

import 'package:args/args.dart';

import 'package:flutter_devicelab/framework/ab.dart';
import 'package:flutter_devicelab/framework/utils.dart';

String kRawSummaryOpt = 'raw-summary';
String kTabTableOpt = 'tsv-table';
String kAsciiTableOpt = 'ascii-table';

void _usage(String error) {
  stderr.writeln(error);
  stderr.writeln('Usage:\n');
  stderr.writeln(_argParser.usage);
  exitCode = 1;
}

Future<void> main(List<String> rawArgs) async {
  ArgResults args;
  try {
    args = _argParser.parse(rawArgs);
  } on FormatException catch (error) {
    _usage('${error.message}\n');
    return;
  }

  final List<String> jsonFiles = args.rest.isNotEmpty ? args.rest : <String>[ 'ABresults.json' ];

  for (final String filename in jsonFiles) {
    final File file = File(filename);
    if (!file.existsSync()) {
      _usage('File "$filename" does not exist');
      return;
    }

    ABTest test;
    try {
      test = ABTest.fromJsonMap(
          const JsonDecoder().convert(await file.readAsString()) as Map<String, dynamic>
      );
    } catch(error) {
      _usage('Could not parse json file "$filename"');
      return;
    }

    if (args[kRawSummaryOpt] as bool) {
      section('Raw results for "$filename"');
      print(test.rawResults());
    }
    if (args[kTabTableOpt] as bool) {
      section('A/B comparison for "$filename"');
      print(test.printSummary());
    }
    if (args[kAsciiTableOpt] as bool) {
      section('Formatted summary for "$filename"');
      print(test.asciiSummary());
    }
  }
}

/// Command-line options for the `summarize.dart` command.
final ArgParser _argParser = ArgParser()
  ..addFlag(
    kAsciiTableOpt,
    defaultsTo: true,
    help: 'Prints the summary in a table formatted nicely for terminal output.',
  )
  ..addFlag(
    kTabTableOpt,
    defaultsTo: true,
    help: 'Prints the summary in a table with tabs for easy spreadsheet entry.',
  )
  ..addFlag(
    kRawSummaryOpt,
    defaultsTo: true,
    help: 'Prints all per-run data collected by the A/B test formatted with\n'
        'tabs for easy spreadsheet entry.',
  );
