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

#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_
#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_

#include <fuchsia/modular/cpp/fidl.h>

#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
#include "rapidjson/document.h"

namespace modular {

constexpr double kMaxConfidence = 1.0;
constexpr double kMinConfidence = 0.0;

class RankingFeature {
 public:
  RankingFeature();
  virtual ~RankingFeature();

  // Compute the numeric value for a feature, ensuring bounds on the result
  // in the range of [0.0,1.0]
  double ComputeFeature(const fuchsia::modular::UserInput& query,
                        const RankedSuggestion& suggestion);

  // Fills the context selector with the values and meta the feature needs to
  // request from the context. Returns true if it filled anything, false
  // otherwise.
  fuchsia::modular::ContextSelectorPtr CreateContextSelector();

  // Updates the context that the feature needs.
  void UpdateContext(const std::vector<fuchsia::modular::ContextValue>&
                         context_update_values);

 protected:
  // Compute the numeric feature for a feature, to be overridden by subclasses
  virtual double ComputeFeatureInternal(
      const fuchsia::modular::UserInput& query,
      const RankedSuggestion& suggestion) = 0;

  // Create the context selector. Returns nullptr if the feature doesn't require
  // context.
  virtual fuchsia::modular::ContextSelectorPtr CreateContextSelectorInternal();

  // Loads a json file into the second value of the pair. The first value
  // indicates if the file could be loaded and parsed.
  std::optional<rapidjson::Document> FetchJsonObject(const std::string& path);

  // Returns current context values the ranking feature has.
  fidl::VectorPtr<fuchsia::modular::ContextValue>& ContextValues();

 private:
  static int instances_;
  fidl::VectorPtr<fuchsia::modular::ContextValue> context_values_;
  const int id_;
};

}  // namespace modular

#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_
