// Copyright 2021 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 "ml/document_scanner_library.h"

#include <string>

#include <base/check.h>
#include <base/logging.h>
#include <base/native_library.h>

namespace ml {
namespace {

using chromeos_camera::document_scanning::CreateDocumentScannerFn;

constexpr char kDocumentScannerLibraryRelativePath[] = "libdocumentscanner.so";

}  // namespace

DocumentScannerLibrary::DocumentScannerLibrary() = default;

DocumentScannerLibrary::~DocumentScannerLibrary() = default;

DocumentScannerLibrary* DocumentScannerLibrary::GetInstance() {
  static base::NoDestructor<DocumentScannerLibrary> instance;
  return instance.get();
}

DocumentScannerLibrary::InitializeResult DocumentScannerLibrary::Initialize(
    const DocumentScannerLibraryParams& params) {
  DCHECK(IsSupported());
  if (initialized_) {
    return InitializeResult::kOk;
  }

  base::NativeLibraryOptions native_library_options = {
      .prefer_own_symbols = true,
  };

  base::NativeLibraryLoadError error;
  library_ = base::ScopedNativeLibrary(base::LoadNativeLibraryWithOptions(
      params.root_dir.Append(kDocumentScannerLibraryRelativePath),
      native_library_options, &error));
  if (!library_.is_valid()) {
    LOG(ERROR) << "Failed to load document scanner library: "
               << error.ToString();
    return InitializeResult::kLoadLibraryFailed;
  }

  create_document_scanner_ = reinterpret_cast<CreateDocumentScannerFn>(
      library_.GetFunctionPointer("CreateDocumentScanner"));
  if (create_document_scanner_ == nullptr) {
    return InitializeResult::kFunctionLookupFailed;
  }

  score_threshold_ = params.score_threshold;
  initialized_ = true;
  return InitializeResult::kOk;
}

std::unique_ptr<LibDocumentScanner>
DocumentScannerLibrary::CreateDocumentScanner() const {
  DCHECK(initialized_);
  return (*create_document_scanner_)(score_threshold_);
}

}  // namespace ml
