// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/configuration/configuration.h"

#include "base/logging.h"
#include "base/memory/singleton.h"
#include "starboard/string.h"
#include "starboard/system.h"

namespace cobalt {
namespace configuration {

Configuration* Configuration::configuration_ = nullptr;

Configuration* Configuration::GetInstance() {
  return base::Singleton<Configuration,
                         base::LeakySingletonTraits<Configuration>>::get();
}

Configuration::Configuration() {
  configuration_api_ = static_cast<const CobaltExtensionConfigurationApi*>(
      SbSystemGetExtension(kCobaltExtensionConfigurationName));
  if (configuration_api_) {
    // Verify it's the extension needed.
    if (strcmp(configuration_api_->name, kCobaltExtensionConfigurationName) !=
            0 ||
        configuration_api_->version < 1) {
      LOG(WARNING) << "Not using supplied cobalt configuration extension: "
                   << "'" << configuration_api_->name << "' ("
                   << configuration_api_->version << ")";
      configuration_api_ = nullptr;
    }
  }
}

const char* Configuration::CobaltUserOnExitStrategy() {
  if (configuration_api_) {
#if defined(COBALT_USER_ON_EXIT_STRATEGY)
    LOG(ERROR) << "COBALT_USER_ON_EXIT_STRATEGY and "
                  "CobaltExtensionConfigurationApi::CobaltUserOnExitStrategy() "
                  "are both defined. Remove 'cobalt_user_on_exit_strategy' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltUserOnExitStrategy().";
#endif
    return configuration_api_->CobaltUserOnExitStrategy();
  }
#if defined(COBALT_USER_ON_EXIT_STRATEGY)
#error "COBALT_USER_ON_EXIT_STRATEGY is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltUserOnExitStrategy()"
#error "instead."
#endif
  return "stop";
}

bool Configuration::CobaltRenderDirtyRegionOnly() {
  if (configuration_api_) {
#if defined(COBALT_RENDER_DIRTY_REGION_ONLY)
    LOG(ERROR)
        << "COBALT_RENDER_DIRTY_REGION_ONLY and "
           "CobaltExtensionConfigurationApi::CobaltRenderDirtyRegionOnly() "
           "are both defined. Remove 'render_dirty_region_only' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltRenderDirtyRegionOnly().";
#endif
    return configuration_api_->CobaltRenderDirtyRegionOnly();
  }
#if defined(COBALT_RENDER_DIRTY_REGION_ONLY)
#error \
    "COBALT_RENDER_DIRTY_REGION_ONLY is deprecated after Starboard version 12."
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltRenderDirtyRegionOnly()"
#error "instead."
#endif
  return false;
}

int Configuration::CobaltEglSwapInterval() {
  if (configuration_api_) {
#if defined(COBALT_EGL_SWAP_INTERVAL)
    LOG(ERROR) << "COBALT_EGL_SWAP_INTERVAL and "
                  "CobaltExtensionConfigurationApi::CobaltEglSwapInterval() "
                  "are both defined. Remove 'cobalt_egl_swap_interval' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltEglSwapInterval().";
#endif
    return configuration_api_->CobaltEglSwapInterval();
  }
#if defined(COBALT_EGL_SWAP_INTERVAL)
#error "COBALT_EGL_SWAP_INTERVAL is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltEglSwapInterval()"
#error "instead."
#endif
  return 1;
}

const char* Configuration::CobaltFallbackSplashScreenUrl() {
  if (configuration_api_) {
#if defined(COBALT_FALLBACK_SPLASH_SCREEN_URL)
    LOG(ERROR)
        << "COBALT_FALLBACK_SPLASH_SCREEN_URL and "
           "CobaltExtensionConfigurationApi::CobaltFallbackSplashScreenUrl() "
           "are both defined. Remove 'fallback_splash_screen_url' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltFallbackSplashScreenUrl().";
#endif
    return configuration_api_->CobaltFallbackSplashScreenUrl();
  }
#if defined(COBALT_FALLBACK_SPLASH_SCREEN_URL)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_FALLBACK_SPLASH_SCREEN_URL is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltFallbackSplashScreenUrl()"
#error "instead."
#endif
  return "none";
}

const char* Configuration::CobaltFallbackSplashScreenTopics() {
  if (configuration_api_ && configuration_api_->version >= 2) {
    return configuration_api_->CobaltFallbackSplashScreenTopics();
  }
  return "";
}

bool Configuration::CobaltEnableQuic() {
  if (configuration_api_) {
#if defined(COBALT_ENABLE_QUIC)
    LOG(ERROR) << "COBALT_ENABLE_QUIC and "
                  "CobaltExtensionConfigurationApi::CobaltEnableQuic() "
                  "are both defined. Remove 'cobalt_enable_quic' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltEnableQuic().";
#endif
    return configuration_api_->CobaltEnableQuic();
  }
#if defined(COBALT_ENABLE_QUIC)
#error "COBALT_ENABLE_QUIC is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltEnableQuic()"
#error "instead."
#endif
  return true;
}

int Configuration::CobaltSkiaCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_SKIA_CACHE_SIZE_IN_BYTES)
    LOG(ERROR)
        << "COBALT_SKIA_CACHE_SIZE_IN_BYTES and "
           "CobaltExtensionConfigurationApi::CobaltSkiaCacheSizeInBytes() "
           "are both defined. Remove 'skia_cache_size_in_bytes' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltSkiaCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltSkiaCacheSizeInBytes();
  }
#if defined(COBALT_SKIA_CACHE_SIZE_IN_BYTES)
#error \
    "COBALT_SKIA_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltSkiaCacheSizeInBytes()"
#error "instead."
#endif
  return 4 * 1024 * 1024;
}

int Configuration::CobaltOffscreenTargetCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES)
    LOG(ERROR)
        << "COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES and "
           "CobaltExtensionConfigurationApi::"
           "CobaltOffscreenTargetCacheSizeInBytes() "
           "are both defined. Remove 'offscreen_target_cache_size_in_bytes' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltOffscreenTargetCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltOffscreenTargetCacheSizeInBytes();
  }
#if defined(COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltOffscreenTargetCacheSizeInBytes()"
#error "instead."
#endif
  return -1;
}

int Configuration::CobaltEncodedImageCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES)
    LOG(ERROR)
        << "COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES and "
           "CobaltExtensionConfigurationApi::"
           "CobaltEncodedImageCacheSizeInBytes() "
           "are both defined. Remove 'encoded_image_cache_size_in_bytes' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltEncodedImageCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltEncodedImageCacheSizeInBytes();
  }
#if defined(COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltEncodedImageCacheSizeInBytes()"
#error "instead."
#endif
  return 1024 * 1024;
}

int Configuration::CobaltImageCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_IMAGE_CACHE_SIZE_IN_BYTES)
    LOG(ERROR)
        << "COBALT_IMAGE_CACHE_SIZE_IN_BYTES and "
           "CobaltExtensionConfigurationApi::CobaltImageCacheSizeInBytes() "
           "are both defined. Remove 'image_cache_size_in_bytes' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltImageCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltImageCacheSizeInBytes();
  }
#if defined(COBALT_IMAGE_CACHE_SIZE_IN_BYTES)
#error \
    "COBALT_IMAGE_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltImageCacheSizeInBytes()"
#error "instead."
#endif
  return -1;
}

int Configuration::CobaltLocalTypefaceCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES)
    LOG(ERROR) << "COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES and "
                  "CobaltExtensionConfigurationApi::"
                  "CobaltLocalTypefaceCacheSizeInBytes() "
                  "are both defined. Remove 'local_font_cache_size_in_bytes' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltLocalTypefaceCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltLocalTypefaceCacheSizeInBytes();
  }
#if defined(COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltLocalTypefaceCacheSizeInBytes()"
#error "instead."
#endif
  return 16 * 1024 * 1024;
}

int Configuration::CobaltRemoteTypefaceCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES)
    LOG(ERROR) << "COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES and "
                  "CobaltExtensionConfigurationApi::"
                  "CobaltRemoteTypefaceCacheSizeInBytes() "
                  "are both defined. Remove 'remote_font_cache_size_in_bytes' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltRemoteTypefaceCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltRemoteTypefaceCacheSizeInBytes();
  }
#if defined(COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltRemoteTypefaceCacheSizeInBytes()"
#error "instead."
#endif
  return 4 * 1024 * 1024;
}

int Configuration::CobaltMeshCacheSizeInBytes() {
  if (configuration_api_) {
#if defined(COBALT_MESH_CACHE_SIZE_IN_BYTES)
    LOG(ERROR)
        << "COBALT_MESH_CACHE_SIZE_IN_BYTES and "
           "CobaltExtensionConfigurationApi::CobaltMeshCacheSizeInBytes() "
           "are both defined. Remove 'mesh_cache_size_in_bytes' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltMeshCacheSizeInBytes().";
#endif
    return configuration_api_->CobaltMeshCacheSizeInBytes();
  }
#if defined(COBALT_MESH_CACHE_SIZE_IN_BYTES)
#error \
    "COBALT_MESH_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltMeshCacheSizeInBytes()"
#error "instead."
#endif
  return 1024 * 1024;
}

// Deprecated, only retained as config API placeholder.
int Configuration::CobaltSoftwareSurfaceCacheSizeInBytes() { return -1; }

float Configuration::CobaltImageCacheCapacityMultiplierWhenPlayingVideo() {
  if (configuration_api_) {
#if defined(COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO)
    LOG(ERROR)
        << "COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO and "
           "CobaltExtensionConfigurationApi::"
           "CobaltImageCacheCapacityMultiplierWhenPlayingVideo() "
           "are both defined. Remove "
           "'image_cache_capacity_multiplier_when_playing_video' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltImageCacheCapacityMultiplierWhenPlayingVideo().";
#endif
    return configuration_api_
        ->CobaltImageCacheCapacityMultiplierWhenPlayingVideo();
  }
#if defined(COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO)
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO is deprecated after Starboard version 12."
// NOLINTNEXTLINE(whitespace/line_length)
#error \
    "Implement CobaltExtensionConfigurationApi::CobaltImageCacheCapacityMultiplierWhenPlayingVideo()"
#error "instead."
#endif
  return 1.0f;
}

int Configuration::CobaltSkiaGlyphAtlasWidth() {
  if (configuration_api_) {
#if defined(COBALT_SKIA_GLYPH_ATLAS_WIDTH)
    LOG(ERROR)
        << "COBALT_SKIA_GLYPH_ATLAS_WIDTH and "
           "CobaltExtensionConfigurationApi::CobaltSkiaGlyphAtlasWidth() "
           "are both defined. Remove 'skia_glyph_atlas_width' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltSkiaGlyphAtlasWidth().";
#endif
    return configuration_api_->CobaltSkiaGlyphAtlasWidth();
  }
#if defined(COBALT_SKIA_GLYPH_ATLAS_WIDTH)
#error "COBALT_SKIA_GLYPH_ATLAS_WIDTH is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltSkiaGlyphAtlasWidth()"
#error "instead."
#endif
  return 2048;
}

int Configuration::CobaltSkiaGlyphAtlasHeight() {
  if (configuration_api_) {
#if defined(COBALT_SKIA_GLYPH_ATLAS_HEIGHT)
    LOG(ERROR)
        << "COBALT_SKIA_GLYPH_ATLAS_HEIGHT and "
           "CobaltExtensionConfigurationApi::CobaltSkiaGlyphAtlasHeight() "
           "are both defined. Remove 'skia_glyph_atlas_height' "
           "from your \"gyp_configuration.gypi\" file in favor of "
           "using CobaltSkiaGlyphAtlasHeight().";
#endif
    return configuration_api_->CobaltSkiaGlyphAtlasHeight();
  }
#if defined(COBALT_SKIA_GLYPH_ATLAS_HEIGHT)
#error \
    "COBALT_SKIA_GLYPH_ATLAS_HEIGHT is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltSkiaGlyphAtlasHeight()"
#error "instead."
#endif
  return 2048;
}

int Configuration::CobaltReduceCpuMemoryBy() {
  if (configuration_api_) {
#if defined(COBALT_REDUCE_CPU_MEMORY_BY)
    LOG(ERROR) << "COBALT_REDUCE_CPU_MEMORY_BY and "
                  "CobaltExtensionConfigurationApi::CobaltReduceCpuMemoryBy() "
                  "are both defined. Remove 'reduce_cpu_memory_by' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltReduceCpuMemoryBy().";
#endif
    return configuration_api_->CobaltReduceCpuMemoryBy();
  }
#if defined(COBALT_REDUCE_CPU_MEMORY_BY)
#error "COBALT_REDUCE_CPU_MEMORY_BY is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltReduceCpuMemoryBy()"
#error "instead."
#endif
  return -1;
}

int Configuration::CobaltReduceGpuMemoryBy() {
  if (configuration_api_) {
#if defined(COBALT_REDUCE_GPU_MEMORY_BY)
    LOG(ERROR) << "COBALT_REDUCE_GPU_MEMORY_BY and "
                  "CobaltExtensionConfigurationApi::CobaltReduceGpuMemoryBy() "
                  "are both defined. Remove 'reduce_gpu_memory_by' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltReduceGpuMemoryBy().";
#endif
    return configuration_api_->CobaltReduceGpuMemoryBy();
  }
#if defined(COBALT_REDUCE_GPU_MEMORY_BY)
#error "COBALT_REDUCE_GPU_MEMORY_BY is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltReduceGpuMemoryBy()"
#error "instead."
#endif
  return -1;
}

bool Configuration::CobaltGcZeal() {
  if (configuration_api_) {
#if defined(COBALT_GC_ZEAL)
    LOG(ERROR) << "COBALT_GC_ZEAL and "
                  "CobaltExtensionConfigurationApi::CobaltGcZeal() "
                  "are both defined. Remove 'cobalt_gc_zeal' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltGcZeal().";
#endif
    return configuration_api_->CobaltGcZeal();
  }
#if defined(COBALT_GC_ZEAL)
#error "COBALT_GC_ZEAL is deprecated after Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltGcZeal()"
#error "instead."
#endif
  return false;
}

const char* Configuration::CobaltRasterizerType() {
  if (configuration_api_) {
#if defined(COBALT_FORCE_STUB_RASTERIZER) || \
    defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
    LOG(ERROR) << "COBALT_FORCE_STUB_RASTERIZER or "
                  "COBALT_FORCE_DIRECT_GLES_RASTERIZER and "
                  "CobaltExtensionConfigurationApi::CobaltRasterizerType() "
                  "are both defined. Remove 'rasterizer_type' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltRasterizerType().";
#endif
    return configuration_api_->CobaltRasterizerType();
  }
#if defined(COBALT_FORCE_STUB_RASTERIZER) || \
    defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
#error "COBALT_FORCE_STUB_RASTERIZER and COBALT_FORCE_DIRECT_GLES_RASTERIZER"
#error "are deprecated after Starboard version 12. Implement"
#error "CobaltExtensionConfigurationApi::CobaltRasterizerType() instead."
#endif
  return "direct-gles";
}

bool Configuration::CobaltEnableJit() {
  if (configuration_api_) {
#if defined(ENGINE_SUPPORTS_JIT) || defined(COBALT_DISABLE_JIT)
    LOG(ERROR) << "ENGINE_SUPPORTS_JIT or COBALT_DISABLE_JIT and "
                  "CobaltExtensionConfigurationApi::CobaltEnableJit() "
                  "are both defined. Remove 'cobalt_enable_jit' "
                  "from your \"gyp_configuration.gypi\" file in favor of "
                  "using CobaltEnableJit().";
#endif
    return configuration_api_->CobaltEnableJit();
  }
#if defined(ENGINE_SUPPORTS_JIT) || defined(COBALT_DISABLE_JIT)
#error "ENGINE_SUPPORTS_JIT and COBALT_DISABLE_JIT are deprecated after"
#error "Starboard version 12."
#error "Implement CobaltExtensionConfigurationApi::CobaltEnableJit()"
#error "instead."
#endif
  return false;
}

}  // namespace configuration
}  // namespace cobalt
