// Copyright (c) 2013 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.

#include "salsa/try_touch_experiment/experiment.h"

using base::SplitString;
using std::string;
using std::vector;

Experiment::Experiment() : is_valid_(false) {}

bool Experiment::valid() const {
  return is_valid_;
}

Experiment::Experiment(string const &experiment_string) {
  vector<string> treatment_strings =
      SplitString(experiment_string, "+", base::KEEP_WHITESPACE,
                  base::SPLIT_WANT_ALL);

  is_valid_ = true;
  for (vector<string>::const_iterator it = treatment_strings.begin();
       it != treatment_strings.end(); ++it) {
    treatments_.push_back(Treatment(*it));
    is_valid_ = is_valid_ && treatments_.back().valid();
  }
}

bool Experiment::Reset() const {
  if (!is_valid_)
    return false;
  return treatments_[0].Reset();
}

bool Experiment::ApplyTreatment(unsigned int treatment_num) const {
  if (treatment_num >= treatments_.size())
    return false;
  return treatments_[treatment_num].Apply();
}

int Experiment::Size() const {
  return treatments_.size();
}
