// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "flutter/shell/platform/darwin/ios/ios_surface.h"

#import "flutter/shell/platform/darwin/ios/ios_surface_software.h"

#include "flutter/shell/platform/darwin/ios/rendering_api_selection.h"

#if SHELL_ENABLE_METAL
#import "flutter/shell/platform/darwin/ios/ios_surface_metal_impeller.h"
#import "flutter/shell/platform/darwin/ios/ios_surface_metal_skia.h"
#endif  // SHELL_ENABLE_METAL

namespace flutter {

std::unique_ptr<IOSSurface> IOSSurface::Create(std::shared_ptr<IOSContext> context,
                                               const fml::scoped_nsobject<CALayer>& layer) {
  FML_DCHECK(layer);
  FML_DCHECK(context);

#if SHELL_ENABLE_METAL
  if (@available(iOS METAL_IOS_VERSION_BASELINE, *)) {
    if ([layer.get() isKindOfClass:[CAMetalLayer class]]) {
      switch (context->GetBackend()) {
        case IOSRenderingBackend::kSkia:
          return std::make_unique<IOSSurfaceMetalSkia>(
              fml::scoped_nsobject<CAMetalLayer>(
                  reinterpret_cast<CAMetalLayer*>([layer.get() retain])),  // Metal layer
              std::move(context)                                           // context
          );
          break;
        case IOSRenderingBackend::kImpeller:
          return std::make_unique<IOSSurfaceMetalImpeller>(
              fml::scoped_nsobject<CAMetalLayer>(
                  reinterpret_cast<CAMetalLayer*>([layer.get() retain])),  // Metal layer
              std::move(context)                                           // context
          );
      }
    }
  }
#endif  // SHELL_ENABLE_METAL

  return std::make_unique<IOSSurfaceSoftware>(layer,              // layer
                                              std::move(context)  // context
  );
}

IOSSurface::IOSSurface(std::shared_ptr<IOSContext> ios_context)
    : ios_context_(std::move(ios_context)) {
  FML_DCHECK(ios_context_);
}

IOSSurface::~IOSSurface() = default;

std::shared_ptr<IOSContext> IOSSurface::GetContext() const {
  return ios_context_;
}

}  // namespace flutter
