// Copyright (c) 2020, 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 script generates the
// lib/src/edit/nnbd_migration/resources/resources.g.dart file from the contents
// of the lib/src/edit/nnbd_migration/resources directory.

import 'dart:convert';
import 'dart:io';
import 'dart:math' as math;

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

void main(List<String> args) {
  if (FileSystemEntity.isFileSync(
      path.join('tool', 'nnbd_migration', 'generate_resources.dart'))) {
    // We're running from the project root - cd up two directories.
    Directory.current = Directory.current.parent.parent;
  } else if (!FileSystemEntity.isDirectorySync(
      path.join('pkg', 'analysis_server'))) {
    fail('Please run this tool from the root of the sdk repo.');
  }

  Directory resourceDir = Directory(path.join('pkg', 'analysis_server', 'lib',
      'src', 'edit', 'nnbd_migration', 'resources'));

  String content = generateResourceFile(resourceDir.listSync().where((entity) {
    String name = path.basename(entity.path);
    return entity is File && (name.endsWith('.js') || name.endsWith('.css'));
  }).cast<File>());

  // write the content
  File resourcesFile = File(path.join('pkg', 'analysis_server', 'lib', 'src',
      'edit', 'nnbd_migration', 'resources', 'resources.g.dart'));
  resourcesFile.writeAsStringSync(content);
}

String generateResourceFile(Iterable<File> resources) {
  String filePath = path.relative(Platform.script.toFilePath());
  StringBuffer buf = StringBuffer('''
// Copyright (c) 2020, 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 file is generated; don't edit it directly.
//
// See $filePath for how
// to edit the source content and for re-generation instructions.

import 'dart:convert' as convert;
''');

  for (File resource in resources) {
    String name = path.basename(resource.path).replaceAll('.', '_');
    buf.writeln();
    buf.writeln('String get $name {');
    buf.writeln('  return _$name ??= _decode(_${name}_base64);');
    buf.writeln('}');
  }

  buf.writeln(r'''

String _decode(String data) {
  data = data.replaceAll('\n', '').trim();
  return String.fromCharCodes(convert.base64Decode(data));
}''');

  for (File resource in resources) {
    String name = path.basename(resource.path).replaceAll('.', '_');
    String source = resource.readAsStringSync();

    String delimiter = "'''";

    buf.writeln();
    buf.writeln('String _$name;');
    buf.writeln('String _${name}_base64 = $delimiter');
    buf.writeln(base64Encode(source.codeUnits));
    buf.writeln('$delimiter;');
  }

  return buf.toString();
}

String base64Encode(List<int> bytes) {
  String encoded = base64.encode(bytes);

  // Logic to cut lines into 80-character chunks
  // – makes for prettier source code
  var lines = <String>[];
  var index = 0;

  while (index < encoded.length) {
    var line = encoded.substring(index, math.min(index + 80, encoded.length));
    lines.add(line);
    index += line.length;
  }

  return lines.join('\n');
}

void fail(String message) {
  stderr.writeln(message);
  exit(1);
}
