#pragma once

#include <cstdint>

#include <Containers/ArrayView.h>
#include <Containers/StringView.h>

using namespace Death::Containers;

namespace nCine::RHI::Vulkan
{
	/**
		@brief Shader-object stub of the Vulkan backend

		The offline emitter already produces `VkVsSpirv`/`VkFsSpirv` per program-variant, and the program object
		creates the `VkShaderModule` objects and pipelines from them. This class therefore carries no source and
		every operation succeeds trivially, only to satisfy the `RHI::Shader` contract alias.
	*/
	class VulkanShader
	{
	public:
		/** @brief Compilation status of the shader (always @ref Status::Compiled for this stub) */
		enum class Status
		{
			NotCompiled,
			CompilationFailed,
			Compiled,
			CompiledWithDeferredChecks
		};

		/** @brief When the compilation status is checked (irrelevant for this stub) */
		enum class ErrorChecking
		{
			Immediate,
			Deferred
		};

		explicit VulkanShader(std::uint32_t type)
			: _type(type), _status(Status::Compiled) {}
		VulkanShader(std::uint32_t type, StringView filename)
			: _type(type), _status(Status::Compiled) {
			static_cast<void>(filename);
		}

		inline std::uint32_t GetGLHandle() const {
			return 0;
		}
		inline Status GetStatus() const {
			return _status;
		}

		bool LoadFromString(StringView string) {
			static_cast<void>(string);
			return true;
		}
		bool LoadFromStrings(ArrayView<const StringView> strings) {
			static_cast<void>(strings);
			return true;
		}
		bool LoadFromFile(StringView filename) {
			static_cast<void>(filename);
			return true;
		}

		bool Compile(ErrorChecking errorChecking, bool logOnErrors) {
			static_cast<void>(errorChecking);
			static_cast<void>(logOnErrors);
			return true;
		}
		bool CheckCompilation(bool logOnErrors) {
			static_cast<void>(logOnErrors);
			return true;
		}

		void SetObjectLabel(StringView label) {
			static_cast<void>(label);
		}

	private:
		std::uint32_t _type;
		Status _status;
	};
}
