/*
 * Copyright 2023 The Cobalt Authors. All Rights Reserved.
 * Copyright 2015 Google Inc. 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.
 */

#ifndef GLIMP_GLES_SHADER_H_
#define GLIMP_GLES_SHADER_H_

#include <GLES3/gl3.h>

#include <string>

#include <memory>
#include "glimp/gles/shader_impl.h"
#include "glimp/ref_counted.h"

namespace glimp {
namespace gles {

class Shader : public nb::RefCountedThreadSafe<Shader> {
 public:
  Shader(std::unique_ptr<ShaderImpl> impl, GLenum type);

  GLenum type() const { return type_; }

  // Called when glShaderSource() is called.
  //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glShaderSource.xml
  void ShaderSource(GLsizei count,
                    const GLchar* const* string,
                    const GLint* length);

  // Called when glCompileShader() is called.
  //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCompileShader.xml
  void CompileShader();

  // Called when glGetShaderiv() is called.  Returns GL_NO_ERROR if the query
  // was successful, otherwise returns the error GLenum that should be returned
  // to the caller.
  GLenum GetShaderiv(GLenum pname, GLint* params);
  void GetShaderInfoLog(GLsizei bufsize, GLsizei* length, GLchar* infolog);

  bool compiled() const { return compile_results_.success; }

  ShaderImpl* impl() const { return impl_.get(); }

 private:
  friend class nb::RefCountedThreadSafe<Shader>;
  ~Shader() {}

  std::unique_ptr<ShaderImpl> impl_;

  GLenum type_;

  std::string source_;

  // Keeps track of the success of the last CompileShader() call.  Can be
  // queried via glGetShaderiv() with the parameter GL_COMPILE_STATUS or
  // GL_INFO_LOG_LENGTH.
  ShaderImpl::CompileResults compile_results_;

  GLint compile_status_;
};

}  // namespace gles
}  // namespace glimp

#endif  // GLIMP_GLES_SHADER_H_
