// 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.

#pragma once

#include <cstdint>
#include <vector>

#include "flutter/fml/mapping.h"
#include "impeller/compiler/includer.h"
#include "impeller/compiler/source_options.h"
#include "shaderc/shaderc.hpp"

namespace impeller {
namespace compiler {

struct SPIRVCompilerSourceProfile {
  shaderc_profile profile = shaderc_profile_core;
  uint32_t version = 460;
};

struct SPIRVCompilerTargetEnv {
  shaderc_target_env env = shaderc_target_env::shaderc_target_env_vulkan;
  shaderc_env_version version =
      shaderc_env_version::shaderc_env_version_vulkan_1_1;
  shaderc_spirv_version spirv_version =
      shaderc_spirv_version::shaderc_spirv_version_1_3;
};

struct SPIRVCompilerOptions {
  bool generate_debug_info = true;
  //----------------------------------------------------------------------------
  // Source Options.
  //----------------------------------------------------------------------------
  std::optional<shaderc_source_language> source_langauge;
  std::optional<SPIRVCompilerSourceProfile> source_profile;

  shaderc_optimization_level optimization_level =
      shaderc_optimization_level::shaderc_optimization_level_performance;

  //----------------------------------------------------------------------------
  // Target Options.
  //----------------------------------------------------------------------------
  std::optional<SPIRVCompilerTargetEnv> target;

  std::vector<std::string> macro_definitions;

  std::shared_ptr<Includer> includer;

  shaderc::CompileOptions BuildShadercOptions() const;
};

class SPIRVCompiler {
 public:
  SPIRVCompiler(const SourceOptions& options,
                std::shared_ptr<const fml::Mapping> sources);

  ~SPIRVCompiler();

  std::shared_ptr<fml::Mapping> CompileToSPV(
      std::stringstream& error_stream,
      const shaderc::CompileOptions& spirv_options) const;

 private:
  SourceOptions options_;
  const std::shared_ptr<const fml::Mapping> sources_;

  std::string GetSourcePrefix() const;

  SPIRVCompiler(const SPIRVCompiler&) = delete;

  SPIRVCompiler& operator=(const SPIRVCompiler&) = delete;
};

}  // namespace compiler
}  // namespace impeller
