// 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 <memory>
#include <utility>
#include <variant>

#include "flutter/fml/logging.h"
#include "flutter/fml/macros.h"
#include "spirv_glsl.hpp"

namespace impeller {
namespace compiler {

class CompilerSkSL : public spirv_cross::CompilerGLSL {
 public:
  explicit CompilerSkSL(std::vector<uint32_t> spirv_)
      : CompilerGLSL(std::move(spirv_)) {}

  CompilerSkSL(const uint32_t* ir_, size_t word_count)
      : CompilerGLSL(ir_, word_count) {}

  explicit CompilerSkSL(const spirv_cross::ParsedIR& ir_)
      : spirv_cross::CompilerGLSL(ir_) {}

  explicit CompilerSkSL(spirv_cross::ParsedIR&& ir_)
      : spirv_cross::CompilerGLSL(std::move(ir_)) {}

  std::string compile() override;

 private:
  std::string output_name_;

  void emit_header() override;

  void emit_uniform(const spirv_cross::SPIRVariable& var) override;

  void detect_unsupported_resources();
  bool emit_constant_resources();
  bool emit_struct_resources();
  bool emit_uniform_resources();
  bool emit_output_resources();
  bool emit_global_variable_resources();
  void emit_resources();

  void emit_interface_block(const spirv_cross::SPIRVariable& var);

  void emit_function_prototype(
      spirv_cross::SPIRFunction& func,
      const spirv_cross::Bitset& return_flags) override;

  std::string image_type_glsl(const spirv_cross::SPIRType& type,
                              uint32_t id = 0) override;

  std::string builtin_to_glsl(spv::BuiltIn builtin,
                              spv::StorageClass storage) override;

  std::string to_texture_op(
      const spirv_cross::Instruction& i,
      bool sparse,
      bool* forward,
      spirv_cross::SmallVector<uint32_t>& inherited_expressions) override;

  std::string to_function_name(
      const spirv_cross::CompilerGLSL::TextureFunctionNameArguments& args)
      override;

  std::string to_function_args(
      const spirv_cross::CompilerGLSL::TextureFunctionArguments& args,
      bool* p_forward) override;
};

}  // namespace compiler
}  // namespace impeller
