# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Asks users if the commit is good or bad."""

from __future__ import print_function

import os

from chromite.cros_bisect import common
from chromite.cros_bisect import evaluator
from chromite.lib import cros_build_lib
from chromite.lib import osutils


class ManualEvaluator(evaluator.Evaluator):
  """Manual evaluator."""

  # Binary evaluator.
  THRESHOLD = 0.5

  def GetReportPath(self, build_label):
    """Obtains report file path.

    Args:
      build_label: current build label to run the evaluation.

    Returns:
      Report file path.
    """
    return os.path.join(self.report_base_dir, 'manual.%s.report' % build_label)

  def Evaluate(self, unused_remote, build_label, unused_repeat=1):
    """Prompts user if the build is good or bad.

    Args:
      unused_remote: Unused args.
      build_label: Build label used for part of report filename and log message.
      unused_repeat: Unused args.

    Returns:
      Score([1.0]) if it is a good build. Otherwise, Score([0.0]).
    """
    report_path = self.GetReportPath(build_label)
    prompt = 'Is %s a good build on the DUT?' % build_label
    is_good = cros_build_lib.BooleanPrompt(prompt=prompt)
    score = 1.0 if is_good else 0.0
    osutils.WriteFile(report_path, '%d' % score)

    return common.Score([score])

  def CheckLastEvaluate(self, build_label, unused_repeat=1):
    """Checks if previous evaluate report is available.

    Args:
      build_label: Build label used for part of report filename and log message.
      unused_repeat: Unused.

    Returns:
      Score([1.0]) if previous result for the build_label is 'Yes'.
      Score([0.0]) if previous result for the build_label is 'No'.
      Score() if previous result does not exist or reuse_eval is unset.
    """
    if self.reuse_eval:
      report_path = self.GetReportPath(build_label)
      if os.path.isfile(report_path):
        content = osutils.ReadFile(report_path)
        if content == '1':
          return common.Score([1.0])
        elif content == '0':
          return common.Score([0.0])

    return common.Score()
