// Copyright (c) 2017, 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 'package:code_builder/code_builder.dart';
import 'package:dart_style/dart_style.dart';

final _dartfmt = DartFormatter(
  languageVersion: DartFormatter.latestLanguageVersion,
);

void main() {
  print('animalClass():\n${'=' * 40}\n${animalClass()}');
  print('scopedLibrary():\n${'=' * 40}\n${scopedLibrary()}');
  print('jsonEnum():\n${'=' * 40}\n${jsonEnum()}');
}

/// Outputs:
///
/// ```dart
/// class Animal extends Organism {
///   void eat() => print('Yum!');
/// }
/// ```
String animalClass() {
  final animal = Class((b) => b
    ..name = 'Animal'
    ..extend = refer('Organism')
    ..methods.add(Method.returnsVoid((b) => b
      ..name = 'eat'
      ..body = refer('print').call([literalString('Yum!')]).code)));
  return _dartfmt.format('${animal.accept(DartEmitter())}');
}

/// Outputs:
///
/// ```dart
/// import 'package:a/a.dart' as _i1;
/// import 'package:b/b.dart' as _i2;
///
/// _i1.Thing doThing() {}
/// _i2.Other doOther() {}
/// ```
String scopedLibrary() {
  final methods = [
    Method((b) => b
      ..body = const Code('')
      ..name = 'doThing'
      ..returns = refer('Thing', 'package:a/a.dart')),
    Method((b) => b
      ..body = const Code('')
      ..name = 'doOther'
      ..returns = refer('Other', 'package:b/b.dart')),
  ];
  final library = Library((b) => b.body.addAll(methods));
  return _dartfmt.format('${library.accept(DartEmitter.scoped())}');
}

/// Outputs:
///
/// ```dart
/// enum Unit {
///  @JsonKey('m')
///  metric,
///  @JsonKey('i')
///  imperial
/// }
/// ```
String jsonEnum() {
  final values = <EnumValue>[
    EnumValue((b) => b
      ..name = 'metric'
      ..annotations.addAll([
        refer('JsonKey').call([literalString('m')])
      ])),
    EnumValue((b) => b
      ..name = 'imperial'
      ..annotations.addAll([
        refer('JsonKey').call([literalString('i')])
      ])),
  ];
  final e = Enum((b) => b
    ..name = 'Unit'
    ..values.addAll(values));
  return _dartfmt.format('${e.accept(DartEmitter())}');
}
