// 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_context.h"

#include "flutter/fml/logging.h"
#import "flutter/shell/platform/darwin/ios/ios_context_software.h"

#if SHELL_ENABLE_METAL
#import "flutter/shell/platform/darwin/ios/ios_context_metal_impeller.h"
#import "flutter/shell/platform/darwin/ios/ios_context_metal_skia.h"
#endif  // SHELL_ENABLE_METAL

namespace flutter {

IOSContext::IOSContext(MsaaSampleCount msaa_samples) : msaa_samples_(msaa_samples) {}

IOSContext::~IOSContext() = default;

std::unique_ptr<IOSContext> IOSContext::Create(IOSRenderingAPI api,
                                               IOSRenderingBackend backend,
                                               MsaaSampleCount msaa_samples) {
  switch (api) {
    case IOSRenderingAPI::kSoftware:
      return std::make_unique<IOSContextSoftware>();
#if SHELL_ENABLE_METAL
    case IOSRenderingAPI::kMetal:
      switch (backend) {
        case IOSRenderingBackend::kSkia:
          return std::make_unique<IOSContextMetalSkia>(msaa_samples);
        case IOSRenderingBackend::kImpeller:
          return std::make_unique<IOSContextMetalImpeller>();
      }
#endif  // SHELL_ENABLE_METAL
    default:
      break;
  }
  FML_CHECK(false);
  return nullptr;
}

IOSRenderingBackend IOSContext::GetBackend() const {
  return IOSRenderingBackend::kSkia;
}

std::shared_ptr<impeller::Context> IOSContext::GetImpellerContext() const {
  return nullptr;
}

}  // namespace flutter
