// Copyright (c) 2019, 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:io';

import 'package:nnbd_migration/src/front_end/migration_info.dart';
import 'package:nnbd_migration/src/front_end/path_mapper.dart';
import 'package:nnbd_migration/src/front_end/resources/resources.g.dart'
    as resources;
import 'package:path/path.dart' as path;

String get _dartSdkVersion {
  var version = Platform.version;

  // Remove the build date and OS.
  if (version.contains(' ')) {
    version = version.substring(0, version.indexOf(' '));
  }

  // Convert a git hash to 8 chars.
  // '2.8.0-edge.fd992e423ef69ece9f44bd3ac58fa2355b563212'
  var versionRegExp = RegExp(r'^.*\.([0-9a-f]+)$');
  var match = versionRegExp.firstMatch(version);
  if (match != null && match.group(1)!.length == 40) {
    var commit = match.group(1)!;
    version = version.replaceAll(commit, commit.substring(0, 10));
  }

  return version;
}

String substituteVariables(String content, Map<String, String?> variables) {
  for (var variable in variables.keys) {
    var value = variables[variable]!;
    content = content.replaceAll('{{ $variable }}', value);
  }

  return content;
}

/// Instrumentation display output for a library that was migrated to use
/// non-nullable types.
class InstrumentationRenderer {
  /// Information for a whole migration, so that libraries can reference each
  /// other.
  final MigrationInfo? migrationInfo;

  /// Whether the migration has been applied already or not.
  final bool hasBeenApplied;

  /// Whether the migration needs to be rerun due to disk changes.
  final bool needsRerun;

  /// An object used to map the file paths of analyzed files to the file paths
  /// of the HTML files used to view the content of those files.
  final PathMapper? pathMapper;

  /// Creates an output object for the given library info.
  InstrumentationRenderer(this.migrationInfo, this.pathMapper,
      this.hasBeenApplied, this.needsRerun);

  /// Returns the path context used to manipulate paths.
  path.Context get pathContext => migrationInfo!.pathContext;

  /// Builds an HTML view of the instrumentation information.
  String render() {
    var variables = <String, String?>{
      'root': migrationInfo!.includedRoot,
      'dartPageScript': resources.migration_js,
      'dartPageStyle': resources.migration_css,
      'highlightJsPath': migrationInfo!.highlightJsPath,
      'highlightStylePath': migrationInfo!.highlightStylePath,
      'dartLogoPath': migrationInfo!.dartLogoPath,
      'sdkVersion': _dartSdkVersion,
      'migrationAppliedStyle': hasBeenApplied ? 'applied' : 'proposed',
      'needsRerunStyle': needsRerun ? 'needs-rerun' : '',
    };

    return substituteVariables(resources.index_html, variables);
  }
}
