// 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`...'),
    );
  });
}
