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

import 'package:path/path.dart' as p;
import 'package:pub/src/exit_codes.dart';
import 'package:test/test.dart';

import 'descriptor.dart' as d;
import 'test_pub.dart';

final s = Platform.pathSeparator;

void main() {
  test('handles errors', () async {
    await d.dir(appPath).create();
    final server = await servePackages();
    server.serve('foo', '1.2.3');
    await runPub(
      args: ['unpack', 'foo:1:2:3'],
      error: contains(
        'Error on line 1, column 1 of descriptor: Invalid version constraint: Could not parse version "1:2:3". Unknown text at "1:2:3".',
      ),
      exitCode: DATA,
    );

    await runPub(
      args: ['unpack', 'foo:1.0'],
      error:
          'Error on line 1, column 1 of descriptor: A dependency specification must be a string or a mapping.',
      exitCode: DATA,
    );

    await runPub(
      args: ['unpack', 'foo'],
    );
    await runPub(
      args: ['unpack', 'foo'],
      error:
          'Target directory `.${s}foo-1.2.3` already exists. Use --force to overwrite',
      exitCode: 1,
    );
    await runPub(args: ['unpack', 'foo', '--force']);
  });

  test('Chooses right version to unpack', () async {
    await d.dir(appPath).create();
    final server = await servePackages();
    server.serve('foo', '0.1.1');
    server.serve('foo', '0.1.0');
    server.serve(
      'foo',
      '1.2.3',
      contents: [
        d.dir('example', [
          d.pubspec({
            'name': 'example',
            'dependencies': {
              'foo': {'path': '..'},
            },
          }),
        ]),
      ],
    );
    server.serve('foo', '1.2.3-pre');
    await d.appDir().create();

    await runPub(
      args: ['unpack', 'foo'],
      output: allOf(
        contains('''
Downloading foo 1.2.3 to `.${s}foo-1.2.3`...
Resolving dependencies in .${s}foo-1.2.3...
'''),
        contains('To explore type: cd .${s}foo-1.2.3'),
        contains(
          'To explore the example type: cd .${s}foo-1.2.3${s}example',
        ),
      ),
    );

    expect(
      File(p.join(d.sandbox, appPath, 'foo-1.2.3', 'pubspec.yaml'))
          .existsSync(),
      isTrue,
    );
    expect(
      File(p.join(d.sandbox, appPath, 'foo-1.2.3', 'example', 'pubspec.yaml'))
          .existsSync(),
      isTrue,
    );

    await runPub(
      args: ['unpack', 'foo:1.2.3-pre', '--output=../'],
      output: allOf(
        contains('''
Downloading foo 1.2.3-pre to `../foo-1.2.3-pre`...
Resolving dependencies in ../foo-1.2.3-pre...
'''),
        contains('To explore type: cd ../foo-1.2.3-pre'),
      ),
    );

    expect(
      File(p.join(d.sandbox, 'foo-1.2.3-pre', 'pubspec.yaml')).existsSync(),
      isTrue,
    );

    await runPub(
      args: ['unpack', 'foo:^0.1.0'],
      output: contains('Downloading foo 0.1.1 to `.${s}foo-0.1.1`...'),
    );
  });

  test('unpack from third party package repository', () async {
    await d.dir(appPath).create();
    final server = await startPackageServer();
    server.serve('foo', '1.0.0');
    server.serve('foo', '1.2.3');
    await runPub(
      args: ['unpack', 'foo:{"hosted":"${server.url}", "version":"1.0.0"}'],
      output: contains('Downloading foo 1.0.0 to `.${s}foo-1.0.0`...'),
    );
  });
}
