#version 410 core

layout (location = 0) in vec2 pos;
layout (location = 1) in vec2 col;
layout (location = 2) in float ind;
layout (location = 3) in float stat;

uniform float z_offset;

//these ints are represented as floats due to how the vertex array is organized
uniform float selected_index;
uniform vec4 color_selected;

//0: normal, 1: identification, 2: only good, 3: only bad, 4: only sketch, 5: good-bad-sketch, 6: normal-bad, 7: highlight selection
uniform int drawing_mode; 

uniform vec4 color_normal;
uniform vec4 color_good;
uniform vec4 color_bad;
uniform vec4 color_sketch;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

uniform float opacity;
uniform bool mirror;

out vec4 frag_color;

void main(){
    gl_Position = projection*view*model*vec4(pos[0], pos[1], z_offset, 1.);
    if(mirror){
        gl_Position = projection*view*model*vec4(-pos[0], pos[1], z_offset, 1.);
    }

    frag_color = color_normal;
    if(drawing_mode == 1){
        //identification
        frag_color = vec4(col[0], col[1], 0.f, 1.f);
    }
    else if(drawing_mode == 2){
        //only good
        if(stat > 0.5f){
            frag_color = vec4(0.f, 0.f, 0.f, 0.f);
        }
        else{
            frag_color = color_good;
        }
    }
    else if(drawing_mode == 3){
        //only bad
        if(stat < 1.5f){
            frag_color = vec4(0.f, 0.f, 0.f, 0.f);
        }
        else{
            frag_color = color_bad;
        }
    }
    else if(drawing_mode == 4){
        //only sketch
        if(stat < 0.5f || stat > 1.5f){
            frag_color = vec4(0.f, 0.f, 0.f, 0.f);
        }
        else{
            frag_color = color_sketch;
        }
    }
    else if(drawing_mode == 5){
        //good-bad-sketch
        if(stat < 0.5f){
            frag_color = color_good;
        }
        else if(stat < 1.5f){
            frag_color = color_sketch;
        }
        else{
            frag_color = color_bad;
        }
    }
    else if(drawing_mode == 6){
        //normal-bad
        if(stat > 1.5f){
            frag_color = color_bad;
        }
    }
    else if(drawing_mode == 7){
        frag_color.a = 0.1f;
    }
    if(selected_index == ind && drawing_mode != 1){
        frag_color = color_selected;
    }

    if(drawing_mode != 1 && (drawing_mode != 7 || opacity < 0.1f)){
        frag_color.a = opacity;
    }
}