// Copyright 2014 The Flutter 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 'dart:io' hide Platform;

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

/// What type of snippet to produce.
enum SnippetType {
  /// Produces a snippet that includes the code interpolated into an application
  /// template.
  sample,

  /// Produces a nicely formatted sample code, but no application.
  snippet,
}

/// Return the name of an enum item.
String getEnumName(dynamic enumItem) {
  final String name = '$enumItem';
  final int index = name.indexOf('.');
  return index == -1 ? name : name.substring(index + 1);
}

/// A class to compute the configuration of the snippets input and output
/// locations based in the current location of the snippets main.dart.
class Configuration {
  Configuration({required this.flutterRoot}) : assert(flutterRoot != null);

  final Directory flutterRoot;

  /// This is the configuration directory for the snippets system, containing
  /// the skeletons and templates.
  @visibleForTesting
  Directory get configDirectory {
    _configPath ??= Directory(
        path.canonicalize(path.join(flutterRoot.absolute.path, 'dev', 'snippets', 'config')));
    return _configPath!;
  }

  // Nullable so that we can use it as a lazy cache.
  Directory? _configPath;

  /// This is where the snippets themselves will be written, in order to be
  /// uploaded to the docs site.
  Directory get outputDirectory {
    _docsDirectory ??= Directory(
        path.canonicalize(path.join(flutterRoot.absolute.path, 'dev', 'docs', 'doc', 'snippets')));
    return _docsDirectory!;
  }

  // Nullable so that we can use it as a lazy cache.
  Directory? _docsDirectory;

  /// This makes sure that the output directory exists.
  void createOutputDirectory() {
    if (!outputDirectory.existsSync()) {
      outputDirectory.createSync(recursive: true);
    }
  }

  /// The directory containing the HTML skeletons to be filled out with metadata
  /// and returned to dartdoc for insertion in the output.
  Directory get skeletonsDirectory => Directory(path.join(configDirectory.path,'skeletons'));

  /// The directory containing the code templates that can be referenced by the
  /// dartdoc.
  Directory get templatesDirectory => Directory(path.join(configDirectory.path, 'templates'));

  /// Gets the skeleton file to use for the given [SnippetType] and DartPad preference.
  File getHtmlSkeletonFile(SnippetType type, {bool showDartPad = false}) {
    assert(!showDartPad || type == SnippetType.sample,
        'Only application snippets work with dartpad.');
    final String filename =
        '${showDartPad ? 'dartpad-' : ''}${getEnumName(type)}.html';
    return File(path.join(skeletonsDirectory.path, filename));
  }
}
