// Copyright 2020 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_HANDWRITING_H_
#define ML_HANDWRITING_H_

#include <base/no_destructor.h>
#include <base/optional.h>
#include <base/scoped_native_library.h>
#include <chromeos/libhandwriting/interface.h>

#include "chrome/knowledge/handwriting/interface.pb.h"

namespace ml {
// A singleton proxy class for the handwriting DSO.
// Usage:
//   auto* const hwr_library = HandwritingLibrary::GetInstance();
//   if (hwr_library->GetStatus() == HandwritingLibrary::kOk) {
//     // Do the real handwriting here.
//     recognizer = hwr_library->CreateHandwritingRecognizer();
//     ...
//   } else {
//     // Otherwise, use HandwritingLibrary::GetStatus() to get the error type.
//     // Maybe return "not installed".
//     ...
//   }
class HandwritingLibrary {
 public:
  // TODO(charleszhao) This enum may be defined in mojom.
  enum class Status {
    kOk = 0,
    kUninitialized = 1,
    kLoadLibraryFailed = 2,
    kFunctionLookupFailed = 3
  };

  ~HandwritingLibrary() = default;

  static HandwritingLibrary* GetInstance();

  // Get whether the library is successfully initialized.
  // Initially, the status is |Status::kUninitialized| (this value should never
  // be returned).
  // If libhandwriting.so can not be loaded, return |kLoadLibraryFailed|. This
  // usually means on-device handwriting is not supported.
  // If the functions can not be successfully looked up, return
  // |kFunctionLookupFailed|.
  // Return |Status::kOk| if everything works fine.
  Status GetStatus() const;

  // The following public member functions define the interface functions of
  // the libhandwriting.so library. Function |InitHandwritingRecognizerLibrary|
  // and |DeleteHandwritingResultData| do not need interfaces because the client
  // won't call it.

  // Creates and returns a handwriting recognizer which is needed for using the
  // other interface. The memory is owned by the user and should be deleted
  // using |DestroyHandwritingRecognizer| after usage.
  HandwritingRecognizer CreateHandwritingRecognizer() const;
  // Load the models and other configuration files with options.
  // |model_path| stores the paths to the data files of the model (machine
  // learning models, configurations etc.). Please see the unit test for
  // examples.
  // Returns true if HandwritingRecognizer is correctly loaded and
  // initialized. Returns false otherwise.
  bool LoadHandwritingRecognizer(
      HandwritingRecognizer recognizer,
      const chrome_knowledge::HandwritingRecognizerOptions& options,
      const chrome_knowledge::HandwritingRecognizerModelPaths& model_path)
      const;
  // Sends the specified |request| to |recognizer|, if succeeds, |result| (which
  // should not be null) is populated with the recognition result.
  // Returns true if succeeds, otherwise returns false.
  bool RecognizeHandwriting(
      HandwritingRecognizer recognizer,
      const chrome_knowledge::HandwritingRecognizerRequest& request,
      chrome_knowledge::HandwritingRecognizerResult* result) const;
  // Destroys the handwriting recognizer created by
  // |CreateHandwritingRecognizer|. Must be called if the handwriting recognizer
  // will not be used anymore, otherwise there will be memory leak.
  void DestroyHandwritingRecognizer(HandwritingRecognizer recognizer) const;

 private:
  friend class base::NoDestructor<HandwritingLibrary>;

  // Initialize the handwriting library.
  HandwritingLibrary();

  base::Optional<base::ScopedNativeLibrary> library_;
  Status status_;

  // Store the interface function pointers.
  // TODO(honglinyu) as pointed out by cjmcdonald@, we should group the pointers
  // into a single |HandwritingInterface| struct and make it optional, i.e.,
  // declaring something like |base::Optional<HandwritingInterface> interface_|.
  CreateHandwritingRecognizerFn create_handwriting_recognizer_;
  LoadHandwritingRecognizerFn load_handwriting_recognizer_;
  RecognizeHandwritingFn recognize_handwriting_;
  DeleteHandwritingResultDataFn delete_handwriting_result_data_;
  DestroyHandwritingRecognizerFn destroy_handwriting_recognizer_;

  DISALLOW_COPY_AND_ASSIGN(HandwritingLibrary);
};

}  // namespace ml

#endif  // ML_HANDWRITING_H_
