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

#include "media/cast/test/utility/input_builder.h"

#include <limits.h>
#include <stdlib.h>
#include <cstdio>

#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {
namespace cast {
namespace test {

static const char kEnablePromptsSwitch[] = "enable-prompts";

InputBuilder::InputBuilder(const std::string& title,
                           const std::string& default_value, int low_range,
                           int high_range)
    : title_(title),
      default_value_(default_value),
      low_range_(low_range),
      high_range_(high_range) {}

InputBuilder::~InputBuilder() {}

std::string InputBuilder::GetStringInput() const {
  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kEnablePromptsSwitch))
    return default_value_;

  printf("\n%s\n", title_.c_str());
  if (!default_value_.empty())
    printf("Hit enter for default (%s):\n", default_value_.c_str());

  printf("# ");
  fflush(stdout);
  char raw_input[128];
  if (!fgets(raw_input, 128, stdin)) {
    NOTREACHED();
    return std::string();
  }

  std::string input = raw_input;
  input = input.substr(0, input.size() - 1);  // Strip last \n.
  if (input.empty() && !default_value_.empty()) return default_value_;

  if (!ValidateInput(input)) {
    printf("Invalid input. Please try again.\n");
    return GetStringInput();
  }
  return input;
}

int InputBuilder::GetIntInput() const {
  std::string string_input = GetStringInput();
  int int_value;
  CHECK(base::StringToInt(string_input, &int_value));
  return int_value;
}

bool InputBuilder::ValidateInput(const std::string& input) const {
  // Check for a valid range.
  if (low_range_ == INT_MIN && high_range_ == INT_MAX) return true;
  int value;
  if (!base::StringToInt(input, &value)) return false;
  return value >= low_range_ && value <= high_range_;
}

}  // namespace test
}  // namespace cast
}  // namespace media
}  // namespace cobalt
