// 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',
          'environment': {'sdk': '>=0.1.2 <0.2.0'},
          'dependencies': {
            'test_pkg': {'path': '../'}
          }
        })
      ]),
      dir('example2', [
        pubspec({
          'name': 'example',
          'environment': {'sdk': '>=0.1.2 <0.2.0'},
          '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,
      );
    }
  });
}
