// 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 'dart:convert';
import 'dart:io';

import 'package:args/args.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;

import 'codegen.dart';
import 'json_schema.dart';

Future<void> main(List<String> arguments) async {
  final args = argParser.parse(arguments);
  if (args[argHelp]) {
    print(argParser.usage);
    return;
  }

  if (args[argDownload]) {
    await downloadSpec();
  }

  final schemaContent = await File(specFile).readAsString();
  final schemaJson = jsonDecode(schemaContent);
  final schema = JsonSchema.fromJson(schemaJson);

  final buffer = IndentableStringBuffer();
  CodeGenerator().writeAll(buffer, schema);
  final generatedCode = buffer.toString();
  await File(generatedCodeFile)
      .writeAsString('$codeFileHeader\n$generatedCode');

  // Format the generated code.
  await Process.run(Platform.resolvedExecutable, ['format', generatedCodeFile]);
}

const argDownload = 'download';
const argHelp = 'help';
const codeFileHeader = '''
// 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.

// This code was auto-generated by tool/dap/generate_all.dart - do not hand-edit!

import 'package:dds/src/dap/protocol_common.dart';
import 'package:dds/src/dap/protocol_special.dart';
''';
final argParser = ArgParser()
  ..addFlag(argHelp, hide: true)
  ..addFlag(argDownload,
      negatable: false,
      abbr: 'd',
      help: 'Download latest version of the DAP spec before generating types');
final generatedCodeFile =
    path.join(toolFolder, '../../lib/src/dap/protocol_generated.dart');
final licenseFile = path.join(specFolder, 'debugAdapterProtocol.license.txt');
final specFile = path.join(specFolder, 'debugAdapterProtocol.json');
final specFolder = path.join(toolFolder, 'external_dap_spec');
final specLicenseUri = Uri.parse(
    'https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/main/License.txt');
final specUri = Uri.parse(
    'https://raw.githubusercontent.com/microsoft/debug-adapter-protocol/gh-pages/debugAdapterProtocol.json');
final toolFolder = path.dirname(Platform.script.toFilePath());

Future<void> downloadSpec() async {
  final specResp = await http.get(specUri);
  final licenseResp = await http.get(specLicenseUri);

  assert(specResp.statusCode == 200);
  assert(licenseResp.statusCode == 200);

  final licenseHeader = '''
debugAdapterProtocol.json is an unmodified copy of the DAP Specification,
downloaded from:

  $specUri

The licence for this file is included below. This accompanying file is the
version of the specification that was used to generate a portion of the Dart
code used to support the protocol.

To regenerate the generated code, run the script in "tool/dap/generate_all.dart"
with no arguments. To download the latest version of the specification before
regenerating the code, run the same script with the "--download" argument.

---
''';

  await File(specFile).writeAsString(specResp.body);
  await File(licenseFile).writeAsString('$licenseHeader\n${licenseResp.body}');
}
