// 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:analyzer/src/codegen/tools.dart';
import 'package:path/path.dart' as path;

import 'api.dart';
import 'codegen_dart_protocol.dart';
import 'from_html.dart';
import 'implied_types.dart';

GeneratedFile target(bool responseRequiresRequestTime) =>
    new GeneratedFile('lib/protocol/protocol_common.dart',
        (String pkgPath) async {
      CodegenCommonVisitor visitor = new CodegenCommonVisitor(
          path.basename(pkgPath),
          responseRequiresRequestTime,
          readApi(pkgPath));
      return visitor.collectCode(visitor.visitApi);
    });

/**
 * A visitor that produces Dart code defining the common types associated with
 * the API.
 */
class CodegenCommonVisitor extends CodegenProtocolVisitor {
  /**
   * Initialize a newly created visitor to generate code in the package with the
   * given [packageName] corresponding to the types in the given [api] that are
   * common to multiple protocols.
   */
  CodegenCommonVisitor(
      String packageName, bool responseRequiresRequestTime, Api api)
      : super(packageName, responseRequiresRequestTime, api);

  @override
  void emitImports() {
    writeln("import 'dart:convert' hide JsonDecoder;");
    writeln();
    writeln("import 'package:analyzer/src/generated/utilities_general.dart';");
    writeln("import 'package:$packageName/protocol/protocol.dart';");
    writeln(
        "import 'package:$packageName/src/protocol/protocol_internal.dart';");
  }

  @override
  List<ImpliedType> getClassesToEmit() {
    List<ImpliedType> types = impliedTypes.values.where((ImpliedType type) {
      ApiNode node = type.apiNode;
      return node is TypeDefinition && node.isExternal;
    }).toList();
    types.sort((first, second) =>
        capitalize(first.camelName).compareTo(capitalize(second.camelName)));
    return types;
  }
}
