// Copyright 2018 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.

#ifndef ML_MODEL_IMPL_H_
#define ML_MODEL_IMPL_H_

#include <list>
#include <memory>
#include <string>

#include <base/macros.h>
#include <mojo/public/cpp/bindings/pending_receiver.h>
#include <mojo/public/cpp/bindings/receiver.h>
#include <tensorflow/lite/model.h>

#include "ml/graph_executor_impl.h"
#include "ml/model_delegate.h"
#include "ml/mojom/model.mojom.h"

namespace ml {

// Holds a ModelDelegate ptr and calls its CreateGraphExecutorDelegate to
// produce GraphExecutorDelegate that can run the graph, and uses
// GraphExecutorDelegate to produce GraphExecutorImpl that can response to mojo
// calls to GraphExecutor interface.
//
// All GraphExecutorImpls created by a ModelImpl reference its model definition
// (and hence may not outlive the ModelImpl). Multiple such GraphExecutorImpls
// may be used concurrently from different sequences.
//
// Example usage:
//  std::unique_ptr<tflite::FlatBufferModel> tflite_model = xxx;
//  const std::string metrics_model_name = xxx;
//  mojo::Remote<Model> model;
//  ModelImpl::Create(
//      std::make_unique<ModelDelegate>(
//          required_input, required_output, std::move(model),
//          std::move(tflite_model), metrics_model_name),
//      model.BindNewPipeAndPassReceiver());
class ModelImpl : public chromeos::machine_learning::mojom::Model {
 public:
  // Takes ownership of `model_delegate` and creates an instance bound to
  // `receiver`.
  //
  // The RAM of the returned model is not owned by the caller. The model object
  // will be deleted when the corresponding mojo connection is closed.
  static ModelImpl* Create(
      std::unique_ptr<ModelDelegate> model_delegate,
      mojo::PendingReceiver<chromeos::machine_learning::mojom::Model> receiver);

  int num_graph_executors_for_testing() const;

 private:
  // Constructor is private, call `Create` to create objects.
  ModelImpl(
      std::unique_ptr<ModelDelegate> model_delegate,
      mojo::PendingReceiver<chromeos::machine_learning::mojom::Model> receiver);
  ModelImpl(const ModelImpl&) = delete;
  ModelImpl& operator=(const ModelImpl&) = delete;

  void set_disconnect_handler(base::OnceClosure disconnect_handler);

  // chromeos::machine_learning::mojom::Model:
  void REMOVED_0(mojo::PendingReceiver<
                     chromeos::machine_learning::mojom::GraphExecutor> receiver,
                 CreateGraphExecutorCallback callback) override;
  void CreateGraphExecutor(
      chromeos::machine_learning::mojom::GraphExecutorOptionsPtr options,
      mojo::PendingReceiver<chromeos::machine_learning::mojom::GraphExecutor>
          receiver,
      CreateGraphExecutorCallback callback) override;

  // Remove a graph executor from our hosted set.
  void EraseGraphExecutor(std::list<GraphExecutorImpl>::const_iterator it);

  // The delegate that actually calls TFLite.
  std::unique_ptr<ModelDelegate> model_delegate_;
  mojo::Receiver<chromeos::machine_learning::mojom::Model> receiver_;

  // Emulate a strongly bound receiver set: hold a set of GraphExecutors,
  // specific elements of which are erased on connection closure.
  //
  // That is, when a pipe to a GraphExecutorImpl closes, that object is removed
  // from this set (by its binding disconnection handler). Further, when a
  // ModelImpl is destroyed, its entire collection of GraphExecutorImpls is also
  // destroyed.
  std::list<GraphExecutorImpl> graph_executors_;
};

}  // namespace ml

#endif  // ML_MODEL_IMPL_H_
