// 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_utilities/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 clientTarget(bool responseRequiresRequestTime) => GeneratedFile(
        '../analysis_server_client/lib/src/protocol/protocol_common.dart',
        (String pkgPath) async {
      var visitor = CodegenCommonVisitor(
          path.basename(pkgPath), responseRequiresRequestTime, readApi(pkgPath),
          forClient: true);
      return visitor.collectCode(visitor.visitApi);
    });

GeneratedFile pluginTarget(bool responseRequiresRequestTime) =>
    GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async {
      var visitor = 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 {
  final bool forClient;

  /// 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,
      {this.forClient = false})
      : super(packageName, responseRequiresRequestTime, api);

  @override
  void emitImports() {
    writeln("import 'dart:convert' hide JsonDecoder;");
    writeln();
    if (forClient) {
      writeln(
          "import 'package:analysis_server_client/src/protocol/protocol_base.dart';");
      writeln(
          "import 'package:analysis_server_client/src/protocol/protocol_internal.dart';");
    } else {
      writeln("import 'package:$packageName/protocol/protocol.dart';");
      writeln(
          "import 'package:$packageName/src/protocol/protocol_internal.dart';");
    }
  }

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