// Copyright 2019 The Chromium Authors. 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:meta/meta.dart';

import '../asset.dart';
import '../base/common.dart';
import '../base/context.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
import '../build_info.dart';
import '../bundle.dart';
import '../globals.dart';
import '../project.dart';
import '../usage.dart';

/// The [WebCompilationProxy] instance.
WebCompilationProxy get webCompilationProxy => context.get<WebCompilationProxy>();

Future<void> buildWeb(FlutterProject flutterProject, String target, BuildInfo buildInfo) async {
  if (!flutterProject.web.existsSync()) {
    throwToolExit('Missing index.html.');
  }
  final Status status = logger.startProgress('Compiling $target for the Web...', timeout: null);
  final Stopwatch sw = Stopwatch()..start();
  final Directory outputDir = fs.directory(getWebBuildDirectory())
    ..createSync(recursive: true);
  bool result;
  try {
    result = await webCompilationProxy.initialize(
      projectDirectory: FlutterProject.current().directory,
      release: buildInfo.isRelease,
    );
    if (result) {
      // Places assets adjacent to the web stuff.
      final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
      await assetBundle.build();
      await writeBundle(fs.directory(fs.path.join(outputDir.path, 'assets')), assetBundle.entries);

      // Copy results to output directory.
      final String outputPath = fs.path.join(
        flutterProject.dartTool.path,
        'build',
        'flutter_web',
        flutterProject.manifest.appName,
        '${fs.path.withoutExtension(target)}_web_entrypoint.dart.js'
      );
      fs.file(outputPath).copySync(fs.path.join(outputDir.path, 'main.dart.js'));
      fs.file('$outputPath.map').copySync(fs.path.join(outputDir.path, 'main.dart.js.map'));
      flutterProject.web.indexFile.copySync(fs.path.join(outputDir.path, 'index.html'));
    }
  } catch (err) {
    printError(err.toString());
    result = false;
  } finally {
    status.stop();
  }
  if (result == false) {
    throwToolExit('Failed to compile $target for the Web.');
  }
  String buildName = 'ddc';
  if (buildInfo.isRelease) {
    buildName = 'dart2js';
  }
  flutterUsage.sendTiming('build', buildName, Duration(milliseconds: sw.elapsedMilliseconds));
}

/// An indirection on web compilation.
///
/// Avoids issues with syncing build_runner_core to other repos.
class WebCompilationProxy {
  const WebCompilationProxy();

  /// Initialize the web compiler from the `projectDirectory`.
  ///
  /// Returns whether or not the build was successful.
  ///
  /// `release` controls whether we build the bundle for dartdevc or only
  /// the entrypoints for dart2js to later take over.
  Future<bool> initialize({
    @required Directory projectDirectory,
    String testOutputDir,
    bool release,
  }) async {
    throw UnimplementedError();
  }

  /// Invalidate the source files in `inputs` and recompile them to JavaScript.
  Future<void> invalidate({@required List<Uri> inputs}) async {
    throw UnimplementedError();
  }
}
