#pragma once

#include <stdint.h>

#define DRAWMODE_NORMAL 0
#define DRAWMODE_PATTERN 1
#define DRAWMODE_AND 2
#define DRAWMODE_OR 3
#define DRAWMODE_XOR 4
#define DRAWMODE_NOT 5

namespace mini
{
    namespace draw
    {
        struct state_t {
            uint8_t     trans = 0;
            uint16_t    fill_pattern = 0b1111111111111111;
            uint8_t     draw_palette[256];
            uint8_t     mode = DRAWMODE_NORMAL;
        };
        extern state_t state;

        void init();
        void quit();
        
        namespace pixel {
            void set(int x, int y, uint8_t color);
            uint8_t get(int x, int y);
        }

        void line(int x0, int y0, int x1, int y1, uint8_t color);
        void hline(int x0, int y, int x1, uint8_t color);
        void vline(int x, int y0, int y1, uint8_t color);

        void rect(int x, int y, int w, int h, uint8_t color);
        void rectf(int x, int y, int w, int h, uint8_t color);

        void circ(int x, int y, uint8_t r, uint8_t color);
        void circf(int x, int y, uint8_t r, uint8_t color);

        void roundrect(int x, int y, int w, int h, uint8_t r, uint8_t color);
        void roundrectf(int x, int y, int w, int h, uint8_t r, uint8_t color);
        void oval(int x0, int y0, int x1, int y1, uint8_t color);
        void ovalf(int x0, int y0, int x1, int y1, uint8_t color);

        namespace pattern {
            void set(uint16_t pat, bool transparent = false);
        }

        void surf(int sx, int sy, int sw, int sh, int dx, int dy, int dw=0, int dh=0, bool flip_x = false, bool flip_y = false, bool invert = false);
        void surfrot(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, bool flip_x, bool flip_y, float angle_deg);
        void tileblit(uint8_t n, int x, int y, int tw, int th);
        
        void text(const char *str, int x, int y, uint8_t color);

        namespace mode
        {
            void set(uint8_t mode);
        }
    }
}