#include "ui.h"
#include <SDL2/SDL.h>
#include <cstring>

namespace ui
{
    uint8_t colors[16][3] = {
        {0,0,0},
        {0,0,128},
        {0,128,0},
        {0,128,128},
        {128,0,0},
        {128,0,128},
        {255,128,0},
        {128,128,128},
        {30,30,30},
        {0,0,255},
        {0,255,0},
        {0,255,255},
        {255,0,0},
        {255,0,255},
        {255,255,0},
        {255,255,255},
    };

    SDL_Renderer *ren = nullptr;
    SDL_Texture *tex = nullptr;

    uint8_t offset_x = 0;
    uint8_t offset_y = 0;

    bool clicked = false;

    SDL_Texture * createtexture(SDL_Renderer *renderer)
    {
        SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, SDL_LoadBMP("font.bmp"));
        SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
        return texture;
    }

    void setrenderer(SDL_Renderer *renderer, SDL_Texture *texture)
    {
        if (ren==renderer) return;
        ren = renderer;
        tex = texture;
        offset_x = offset_y = 0;
    }

    void setoffset(uint8_t x, uint8_t y)
    {
        offset_x = x;
        offset_y = y;
    }

    void box(int x, int y, int w, int h, uint8_t color)
    {
        SDL_Rect rect {((offset_x+x)*CHR_W)+3, ((offset_y+y)*CHR_H)+6, w*CHR_W-6, h*CHR_H-13};
        SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255);
        SDL_RenderDrawRect(ren, &rect);
    }

    void printrect(int x, int y, int w, int h, uint8_t color)
    {
        SDL_Rect rect {(offset_x+x)*CHR_W, (offset_y+y)*CHR_H, w*CHR_W, h*CHR_H};
        SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255);
        SDL_RenderFillRect(ren, &rect);
    }

    void printvoidrect(int x, int y, int w, int h, uint8_t color)
    {
        SDL_Rect rect {(offset_x+x)*CHR_W, (offset_y+y)*CHR_H, w*CHR_W, h*CHR_H};
        SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255);
        SDL_RenderDrawRect(ren, &rect);
    }

    void printchar(int x, int y, char chr, uint8_t color)
    {
        if (color != 255) SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255);
        if (chr==32) return;
        if (chr<32 || chr>127) chr = '.';
        SDL_Rect src {((chr-32)&0xf)*CHR_W, ((chr-32)>>4)*CHR_H, CHR_W, CHR_H};
        SDL_Rect dst {(offset_x+x)*CHR_W, (offset_y+y)*CHR_H, CHR_W, CHR_H};
        SDL_RenderCopy(ren, tex, &src, &dst);
    }

    void printtxt(int x, int y, const char *text, uint8_t color)
    {
        SDL_SetTextureColorMod(tex, colors[color][0], colors[color][1], colors[color][2]);
        for (int i=0; i<strlen(text);++i) if (text[i]!=32) printchar(x+i, y, text[i]);
    }

    void setClicked(const bool value)
    {
        clicked = value;
    }

    const bool getClicked()
    {
        return clicked;
    }

}
