// Copyright 2018 The Chromium 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 "services/shape_detection/face_detection_provider_mac.h"

#include <memory>
#include <utility>

#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/shape_detection/face_detection_impl_mac.h"
#include "services/shape_detection/face_detection_impl_mac_vision.h"

namespace shape_detection {

FaceDetectionProviderMac::FaceDetectionProviderMac() = default;

FaceDetectionProviderMac::~FaceDetectionProviderMac() = default;

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

void FaceDetectionProviderMac::CreateFaceDetection(
    mojo::PendingReceiver<mojom::FaceDetection> receiver,
    mojom::FaceDetectorOptionsPtr options) {
  // Vision Framework needs at least MAC OS X 10.13.
  if (@available(macOS 10.13, *)) {
    // Vision is more accurate than Core Image Framework, but it also needs more
    // processing time.
    if (!options->fast_mode) {
      auto impl = std::make_unique<FaceDetectionImplMacVision>();
      auto* impl_ptr = impl.get();
      impl_ptr->SetReceiver(
          mojo::MakeSelfOwnedReceiver(std::move(impl), std::move(receiver)));
      return;
    }
  }

  mojo::MakeSelfOwnedReceiver(
      std::make_unique<FaceDetectionImplMac>(std::move(options)),
      std::move(receiver));
}

}  // namespace shape_detection
