#pragma once

#include "Shader.h"
#include <string>
#include <memory>

class ShaderProgram;

/**
 * @brief 完整着色器程序抽象基类 (对应 Java CompleteShader 接口)
 * 封装一个完整的着色器程序所需的顶点和片段着色器定义，以及程序的元数据和初始化逻辑。
 */
class CompleteShader {
public:
    // 虚析构函数是基类的最佳实践
    virtual ~CompleteShader() = default;

    /**
     * @brief 获取顶点着色器定义。
     * @return 顶点着色器对象。
     */
    virtual const Shader& getVertexShader() const = 0;

    /**
     * @brief 获取片段着色器定义。
     * @return 片段着色器对象。
     */
    virtual const Shader& getFragmentShader() const = 0;

    /**
     * @brief 获取完整着色器程序的名称。
     * @return 程序名称字符串。
     */
    virtual std::string getShaderName() const = 0;

    /**
     * @brief 检查这是否是默认着色器。
     * @return 如果是默认着色器返回 true。
     */
    virtual bool isDefaultShader() const = 0;

    /**
     * @brief 设置程序链接完成后所需的默认统一变量。
     * 对应 Java 接口中的 default 方法。
     * @param program 已链接的 ShaderProgram 对象指针。
     */
    virtual void setDefaultUniforms(ShaderProgram* program) const {}
};