#ifndef EASYGL_CONSTANTS_H
#define EASYGL_CONSTANTS_H

/**
 * Some typical (and non typical...) colours, mostly taken from the X11 colours, and put in an enum,
 * so that you can get some reasonable colours from an index variable or something, and so you
 * don't have to generate your own. NUM_COLOR's value should be the same as the number of colours.
 *
 * If you would like to add you own, add them here, and to predef_colors and ps_colors in graphcis.c
 * Note that general custom colour constants should probably just be const t_color variables.
 */
enum color_types {
    WHITE = 0, BLACK, DARKGREY, LIGHTGREY,
    RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE, // standard ranbow colours.
    PINK, LIGHTPINK, DARKGREEN, MAGENTA, // some other colours
    BISQUE, // A weird colour, not unlike the "peach" colour of pencil crayons, but closer to "Blanched Almond" and "Moccasin"
    LIGHTSKYBLUE, // A nice light blue
    THISTLE, // A sort of desaturated purple, the colour of thistle flowers
    PLUM, // much closer to pink than the colour of actual plums, and closer to its flower's colour
    KHAKI, // Wikipedia says "a light shade of yellow-green" , but this one is more yellow, and very light
    CORAL, // A burnt pinkish-orange perhaps?
    TURQUOISE, // turquoise
    MEDIUMPURPLE, // A nice medium purple
    DARKSLATEBLUE, // A deep blue, almost purple
    DARKKHAKI, // darker khaki
    LIGHTMEDIUMBLUE, // A light blue, with nice contrast to white, but distinct from "BLUE" (NON-X11)
    SADDLEBROWN, // The browest brown in X11
    FIREBRICK, // dark red
    LIMEGREEN, // a pleasing slightly dark green
    NUM_COLOR
};


/**
 * Line types for setlinestyle(..)
 */
enum line_types {
    SOLID, DASHED
};
enum line_caps {
    BUTT = 0, ROUND
};

/**
 * To distinguish drawing to screen coordinates or world coordinates when using
 * a function such as drawline(world/screen coordates)
 */
typedef enum {
    GL_WORLD = 0,
    GL_SCREEN = 1
} t_coordinate_system;

/**
 * @brief Enum to distinguish drawing to screen or to offscreen buffer.
 */
typedef enum {
    ON_SCREEN = 0,
    OFF_SCREEN
} t_draw_to;

enum e_draw_mode {
    DRAW_NORMAL = 0,
    DRAW_XOR
};


/* 
 * Used to pass information from event_loop when a mouse button is pressed 
 * -- which button was pressed, and was shift and/or control being held
 * down when the button was pressed.
 */
typedef struct {
    bool shift_pressed; /* indicates whether a Shift key was pressed when a mouse button is pressed */
    bool ctrl_pressed; /* indicates whether a Ctrl key was pressed when a mouse button is pressed */
    unsigned int button; /* indicates what button is pressed: left click is 1; right click is 3; */
    /* scroll wheel click is 2; scroll wheel forward rotate is 4; */
    /* scroll wheel backward is 5. */
} t_event_buttonPressed; 


#endif // EASYGL_CONSTANTS_H
