// Copyright 2020 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file

// Called by https://pub.dartlang.org/packages/peanut to generate example pages
// for hosting.
//
// Requires at least v3.2.0 of `package:peanut`

import 'dart:convert';
import 'dart:io';

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

import 'common.dart';

void main(List<String> args) async {
  final buildDir = args[0];
  final fileMap =
      (jsonDecode(args[1]) as Map<String, dynamic>).cast<String, String>();

  if (fileMap.length < 2) {
    throw StateError('We are assuming there is more than one sample!');
  }

  // This is USUALLY the case – where we have more than one demo
  for (var exampleDir in fileMap.values) {
    for (var htmlFile in Directory(p.join(buildDir, exampleDir))
        .listSync()
        .whereType<File>()
        .where((f) => p.extension(f.path) == '.html')) {
      _updateHtml(htmlFile, buildDir, exampleDir);
    }
  }

  // Move each sample into a subdirectory, 'web'
  for (var exampleDir in fileMap.values) {
    var oldDirectory = Directory(p.join(buildDir, exampleDir));
    Directory(p.join(buildDir, 'web')).createSync();
    oldDirectory.renameSync(p.join(buildDir, 'web', exampleDir));
  }

  // Build the sample index and copy the files into this directory
  print('building the sample index...');
  await run('samples_index', 'flutter', ['pub', 'get']);
  await run('samples_index', 'flutter', ['pub', 'run', 'grinder', 'deploy']);

  // Copy the contents of the samples_index/public directory to the build
  // directory
  logWrapped(ansiMagenta, '  Copying samples_index/public to build directory');
  var contents = Directory(p.join('samples_index', 'public')).listSync();
  for (var entity in contents) {
    var newPath = p.join(buildDir, p.basename(entity.path));
    entity.renameSync(newPath);
  }
}

void _updateHtml(File htmlFile, String buildDir, String exampleDir) {
  final content = htmlFile.readAsStringSync();

  final filePath = p.relative(htmlFile.path, from: buildDir);

  if (!content.contains(_standardMeta)) {
    print('!!! missing standard meta! - $filePath');
  }

  final newContent = content
      .replaceFirst('<head>', '<head>\n$_analytics')
      .replaceFirst(_emptyTitle,
          '<title>${_prettyName(exampleDir)} - Flutter web sample</title>');

  if (newContent == content) {
    print('!!! Did not replace contents in $filePath');
  } else {
    print('Replaced contents in $filePath');
    htmlFile.writeAsStringSync(newContent, flush: true);
  }
}

final _underscoreOrSlash = RegExp('_|/');

String _prettyName(String input) =>
    input.split(_underscoreOrSlash).where((e) => e.isNotEmpty).map((e) {
      return e.substring(0, 1).toUpperCase() + e.substring(1);
    }).join(' ');

// flutter.github.io
const _analyticsId = 'UA-67589403-8';

const _analytics = '''
<script async src="https://www.googletagmanager.com/gtag/js?id=$_analyticsId"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', '$_analyticsId');
</script>''';

const _emptyTitle = '<title></title>';

const _standardMeta = '''
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  $_emptyTitle''';
