// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/shape_detection/barcode_detection_provider_mac.h"

#include <memory>
#include <utility>

#include "base/logging.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/shape_detection/barcode_detection_impl_mac_vision.h"

namespace shape_detection {

BarcodeDetectionProviderMac::BarcodeDetectionProviderMac() = default;
BarcodeDetectionProviderMac::BarcodeDetectionProviderMac(
    std::unique_ptr<VisionAPIInterface> vision_api)
    : vision_api_(std::move(vision_api)) {}

BarcodeDetectionProviderMac::~BarcodeDetectionProviderMac() = default;

// static
void BarcodeDetectionProviderMac::Create(
    mojo::PendingReceiver<mojom::BarcodeDetectionProvider> receiver) {
  mojo::MakeSelfOwnedReceiver(std::make_unique<BarcodeDetectionProviderMac>(),
                              std::move(receiver));
}

void BarcodeDetectionProviderMac::CreateBarcodeDetection(
    mojo::PendingReceiver<mojom::BarcodeDetection> receiver,
    mojom::BarcodeDetectorOptionsPtr options) {
  if (!vision_api_)
    vision_api_ = VisionAPIInterface::Create();

  auto impl =
      std::make_unique<BarcodeDetectionImplMacVision>(std::move(options));
  auto* impl_ptr = impl.get();
  impl_ptr->SetReceiver(
      mojo::MakeSelfOwnedReceiver(std::move(impl), std::move(receiver)));
}

void BarcodeDetectionProviderMac::EnumerateSupportedFormats(
    EnumerateSupportedFormatsCallback callback) {
  // If we have supported formats already cached, return them.
  if (supported_formats_) {
    DLOG_IF(WARNING, supported_formats_->empty())
        << "Supported formats requested previously but error or none "
        << "recognized.";

    std::move(callback).Run(supported_formats_.value());
    return;
  }

  if (!vision_api_) {
    vision_api_ = VisionAPIInterface::Create();
  }

  supported_formats_ =
      BarcodeDetectionImplMacVision::GetSupportedSymbologies(vision_api_.get());
  std::move(callback).Run(supported_formats_.value());
}

}  // namespace shape_detection
