// 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 fixup_user_functions();

  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();
  bool emit_undefined_values();
  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
