// Copyright (c) 2021, 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:convert';

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

import 'descriptor.dart';
import 'golden_file.dart';
import 'test_pub.dart';

Future<void> main() async {
  testWithGolden('commands taking a --directory/-C parameter work',
      (ctx) async {
    await servePackages()
      ..serve('foo', '1.0.0')
      ..serve('foo', '0.1.2')
      ..serve('bar', '1.2.3');
    await credentialsFile(globalServer, 'access-token').create();
    globalServer.handle(
      RegExp('/api/packages/test_pkg/uploaders'),
      (request) {
        return shelf.Response.ok(
          jsonEncode({
            'success': {'message': 'Good job!'}
          }),
          headers: {'content-type': 'application/json'},
        );
      },
    );

    await validPackage.create();
    await dir(appPath, [
      dir('bin', [
        file('app.dart', '''
main() => print('Hi');
''')
      ]),
      dir('example', [
        pubspec({
          'name': 'example',
          'dependencies': {
            'test_pkg': {'path': '../'}
          }
        })
      ]),
      dir('example2', [
        pubspec({
          'name': 'example',
          'dependencies': {
            'myapp': {'path': '../'} // Wrong name of dependency
          }
        })
      ]),
    ]).create();

    final cases = [
      // Try --directory after command.
      ['add', '--directory=$appPath', 'foo'],
      // Try the top-level version also.
      ['-C', appPath, 'add', 'bar'],
      // When both top-level and after command, the one after command takes
      // precedence.
      ['-C', p.join(appPath, 'example'), 'get', '--directory=$appPath', 'bar'],
      ['remove', 'bar', '-C', appPath],
      ['get', 'bar', '-C', appPath],
      ['get', 'bar', '-C', '$appPath/example'],
      ['get', 'bar', '-C', '$appPath/example2'],
      ['get', 'bar', '-C', '$appPath/broken_dir'],
      ['downgrade', '-C', appPath],
      ['upgrade', 'bar', '-C', appPath],
      ['run', '-C', appPath, 'bin/app.dart'],
      ['publish', '-C', appPath, '--dry-run'],
      ['uploader', '-C', appPath, 'add', 'sigurdm@google.com'],
      ['deps', '-C', appPath],
    ];

    for (var i = 0; i < cases.length; i++) {
      await ctx.run(
        cases[i],
        workingDirectory: sandbox,
      );
    }
  });
}
