// 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/context.dart';
import '../base/user_messages.dart';
import '../doctor.dart';
import 'visual_studio.dart';

VisualStudioValidator get visualStudioValidator => context.get<VisualStudioValidator>();

class VisualStudioValidator extends DoctorValidator {
  const VisualStudioValidator() : super('Visual Studio - develop for Windows');

  @override
  Future<ValidationResult> validate() async {
    final List<ValidationMessage> messages = <ValidationMessage>[];
    ValidationType status = ValidationType.missing;
    String versionInfo;

    if (visualStudio.isInstalled) {
      status = ValidationType.installed;

      messages.add(ValidationMessage(
          userMessages.visualStudioLocation(visualStudio.installLocation)
      ));

      messages.add(ValidationMessage(userMessages.visualStudioVersion(
          visualStudio.displayName,
          visualStudio.fullVersion,
      )));

      if (visualStudio.isPrerelease) {
        messages.add(ValidationMessage(userMessages.visualStudioIsPrerelease));
      }

      // Messages for faulty installations.
      if (!visualStudio.isAtLeastMinimumVersion) {
        status = ValidationType.partial;
        messages.add(ValidationMessage.error(
            userMessages.visualStudioTooOld(
                visualStudio.minimumVersionDescription,
                visualStudio.workloadDescription,
                visualStudio.necessaryComponentDescriptions(),
            ),
        ));
      } else if (visualStudio.isRebootRequired) {
        status = ValidationType.partial;
        messages.add(ValidationMessage.error(userMessages.visualStudioRebootRequired));
      } else if (!visualStudio.isComplete) {
        status = ValidationType.partial;
        messages.add(ValidationMessage.error(userMessages.visualStudioIsIncomplete));
      } else if (!visualStudio.isLaunchable) {
        status = ValidationType.partial;
        messages.add(ValidationMessage.error(userMessages.visualStudioNotLaunchable));
      } else if (!visualStudio.hasNecessaryComponents) {
        status = ValidationType.partial;
        messages.add(ValidationMessage.error(
            userMessages.visualStudioMissingComponents(
                visualStudio.workloadDescription,
                visualStudio.necessaryComponentDescriptions(),
            ),
        ));
      }
      versionInfo = '${visualStudio.displayName} ${visualStudio.displayVersion}';
    } else {
      status = ValidationType.missing;
      messages.add(ValidationMessage.error(
        userMessages.visualStudioMissing(
          visualStudio.workloadDescription,
          visualStudio.necessaryComponentDescriptions(),
        ),
      ));
    }

    return ValidationResult(status, messages, statusInfo: versionInfo);
  }
}
