// 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 '../templates.dart';
import 'common.dart' as common;

/// A generator for a hello world command-line application.
class ConsoleGenerator extends DefaultGenerator {
  ConsoleGenerator()
    : super(
        'console',
        'Console Application',
        'A command-line application.',
        alternateId: 'console-full',
        categories: const ['dart', 'console'],
      ) {
    addFile('.gitignore', common.gitignore);
    addFile('analysis_options.yaml', common.analysisOptions);
    addFile('CHANGELOG.md', common.changelog);
    addFile('pubspec.yaml', _pubspec);
    addFile('README.md', _readme);
    setEntrypoint(addFile('bin/__projectName__.dart', _mainDart));
    addFile('lib/__projectName__.dart', _libDart);
    addFile('test/__projectName___test.dart', _testDart);
  }

  @override
  String getInstallInstructions(String directory, {String? scriptPath}) =>
      super.getInstallInstructions(directory);
}

final String _pubspec =
    '''
name: __projectName__
description: A sample command-line application.
version: 1.0.0
# repository: https://github.com/my_org/my_repo

environment:
  ${common.sdkConstraint}

# Add regular dependencies here.
dependencies:
  path: ^1.9.0

dev_dependencies:
  lints: ^6.0.0
  test: ^1.25.6
''';

final String _readme = '''
A sample command-line application with an entrypoint in `bin/`, library code
in `lib/`, and example unit test in `test/`.
''';

final String _mainDart = r'''
import 'package:__projectName__/__projectName__.dart' as __projectName__;

void main(List<String> arguments) {
  print('Hello world: ${__projectName__.calculate()}!');
}
''';

final String _libDart = '''
int calculate() {
  return 6 * 7;
}
''';

final String _testDart = '''
import 'package:__projectName__/__projectName__.dart';
import 'package:test/test.dart';

void main() {
  test('calculate', () {
    expect(calculate(), 42);
  });
}
''';
