// 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:ffi' as ffi show Abi;
import 'dart:io' as io show Directory, Platform, exitCode, stderr;

import 'package:engine_build_configs/engine_build_configs.dart';
import 'package:engine_repo_tools/engine_repo_tools.dart';
import 'package:path/path.dart' as p;
import 'package:platform/platform.dart';
import 'package:process_runner/process_runner.dart';

import 'src/commands/command_runner.dart';
import 'src/environment.dart';
import 'src/logger.dart';

void main(List<String> args) async {
  // Find the engine repo.
  final Engine engine;
  try {
    engine = Engine.findWithin(p.dirname(io.Platform.script.toFilePath()));
  } catch (e) {
    io.stderr.writeln(e);
    io.exitCode = 1;
    return;
  }

  // Find and parse the engine build configs.
  final io.Directory buildConfigsDir = io.Directory(p.join(
    engine.flutterDir.path,
    'ci',
    'builders',
  ));
  final BuildConfigLoader loader = BuildConfigLoader(
    buildConfigsDir: buildConfigsDir,
  );

  // Treat it as an error if no build configs were found. The caller likely
  // expected to find some.
  final Map<String, BuilderConfig> configs = loader.configs;
  if (configs.isEmpty) {
    io.stderr.writeln(
      'Error: No build configs found under ${buildConfigsDir.path}',
    );
    io.exitCode = 1;
    return;
  }
  if (loader.errors.isNotEmpty) {
    loader.errors.forEach(io.stderr.writeln);
    io.exitCode = 1;
  }

  final Environment environment = Environment(
    abi: ffi.Abi.current(),
    engine: engine,
    platform: const LocalPlatform(),
    processRunner: ProcessRunner(),
    logger: Logger(),
  );

  // Use the Engine and BuildConfig collection to build the CommandRunner.
  final ToolCommandRunner runner = ToolCommandRunner(
    environment: environment,
    configs: configs,
  );

  try {
    io.exitCode = await runner.run(args);
  } on FatalError catch (e, st) {
    environment.logger.error('FatalError caught in main. Please file a bug\n'
        'error: $e\n'
        'stack: $st');
    io.exitCode = 1;
  }
  return;
}
