// Copyright 2019 The Flutter team. 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:async';
import 'dart:convert';
import 'dart:io';

import 'package:async/async.dart' show StreamGroup;
import 'package:grinder/grinder.dart';

void main(List<String> args) => grind(args);

@DefaultTask()
@Depends(pubGet, generateJsonBindings, analyzeSource, test)
void build() {}

@Task()
Future<void> pubGet() async => _logProcessOutput(
      Process.start(
        'flutter',
        ['pub', 'get'],
      ),
    );

@Task()
Future<void> generateJsonBindings() async => _logProcessOutput(
      Process.start(
        'flutter',
        ['pub', 'run', 'build_runner', 'build', '--delete-conflicting-outputs'],
      ),
    );

@Task()
Future<void> watch() async => _logProcessOutput(
      Process.start(
        'flutter',
        ['pub', 'run', 'build_runner', 'watch'],
      ),
    );

@Task()
Future<void> analyzeSource() async => _logProcessOutput(
      Process.start(
        'flutter',
        ['analyze'],
      ),
    );

@Task()
Future<void> test() async => _logProcessOutput(
      Process.start(
        'flutter',
        ['test'],
      ),
    );

@Task()
Future<void> clean() => _logProcessOutput(
      Process.start(
        'flutter',
        ['clean'],
      ),
    );

Future<void> _logProcessOutput(Future<Process> proc) async {
  final process = await proc;
  final output = StreamGroup.merge([process.stdout, process.stderr]);
  await for (final message in output) {
    log(utf8.decode(message));
  }
}