// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. 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:io';

import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
import 'package:test_process/test_process.dart';

Future<ProcResult> tryPub(String content) async {
  await d.file('pubspec.yaml', content).create();

  final proc = await TestProcess.start(
    Platform.resolvedExecutable,
    ['pub', 'get', '--offline'],
    workingDirectory: d.sandbox,
    // Don't pass current process VM options to child
    environment: Map.from(Platform.environment)..remove('DART_VM_OPTIONS'),
  );

  final result = await ProcResult.fromTestProcess(proc);

  printOnFailure(
    [
      '-----BEGIN pub output-----',
      result.toString().trim(),
      '-----END pub output-----',
    ].join('\n'),
  );

  if (result.exitCode == 0) {
    final lockContent = File(
      p.join(d.sandbox, 'pubspec.lock'),
    ).readAsStringSync();

    printOnFailure(
      [
        '-----BEGIN pubspec.lock-----',
        lockContent.trim(),
        '-----END pubspec.lock-----',
      ].join('\n'),
    );
  }

  return result;
}

class ProcResult {
  final int exitCode;
  final List<ProcLine> lines;

  bool get cleanParse => exitCode == 0 || exitCode == 66 || exitCode == 69;

  ProcResult(this.exitCode, this.lines);

  static Future<ProcResult> fromTestProcess(TestProcess proc) async {
    final items = <ProcLine>[];

    final values = await Future.wait([
      proc.exitCode,
      proc.stdoutStream().forEach((line) => items.add(ProcLine(false, line))),
      proc.stderrStream().forEach((line) => items.add(ProcLine(true, line))),
    ]);

    return ProcResult(values[0] as int, items);
  }

  @override
  String toString() {
    final buffer = StringBuffer('Exit code: $exitCode');
    for (var line in lines) {
      buffer.write('\n$line');
    }
    return buffer.toString();
  }
}

class ProcLine {
  final bool isError;
  final String line;

  ProcLine(this.isError, this.line);

  @override
  String toString() => '${isError ? 'err' : 'out'}  $line';
}
