// 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 'base/common.dart';
import 'base/file_system.dart';
import 'cache.dart';

/// A validator that runs before the tool runs any command.
abstract class PreRunValidator {
  factory PreRunValidator({
    required FileSystem fileSystem,
  }) => _DefaultPreRunValidator(fileSystem: fileSystem);

  void validate();
}

class _DefaultPreRunValidator implements PreRunValidator {
  _DefaultPreRunValidator({
    required this.fileSystem,
  });

  final FileSystem fileSystem;

  late final Directory _toolsDir = fileSystem.directory(
      fileSystem.path.join(Cache.flutterRoot!, 'packages', 'flutter_tools'),
  );

  @override
  void validate() {
    // If a user downloads the Flutter SDK via a pre-built archive and there is
    // an error during extraction, the user could have a valid Dart snapshot of
    // the tool but not the source directory. We still need the source, so
    // validate the source directory exists and toolExit if not.
    if (!_toolsDir.existsSync()) {
      throwToolExit(
        'Flutter SDK installation appears corrupted: expected to find the '
        'directory ${_toolsDir.path} but it does not exist! Please go to '
        'https://flutter.dev/setup for instructions on how to re-install '
        'Flutter.',
      );
    }
  }
}

class NoOpPreRunValidator implements PreRunValidator {
  const NoOpPreRunValidator();

  @override
  void validate() {}
}
