#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>

#include "breakout.h"
#include "vector.h"

#ifndef __nullptr__
#define Nullptr(type) (type *)0
#endif // __nullptr__

void DrawFrame();
void INITIALIZE();
void QUIT();
void GAMELOOP();
void mousePress(SDL_MouseButtonEvent b);
void keyPress(SDL_KeyboardEvent b);
void windowChanged(SDL_WindowEvent b);
void toggleFullscreen();

const int width = 1600; // TODO: Fullscreen
const int height = 900;

Uint8 * keystate; // TODO: export all this into scenery and enemy waves
SDL_Window * window;
SDL_Renderer * renderer;
SDL_Event event;
bool running = true, fullscreen = false;

Ball ball;

int main(int argc, char * args[]){
    // system("bhi.exe");
    INITIALIZE();
    while (running) { // Gameloop
        GAMELOOP();
        DrawFrame();
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
                case SDL_QUIT:
                    running = false;
                    break;
                case SDL_KEYDOWN:
                    if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) running = false;
                    else keyPress(event.key);
                    break;
                case SDL_MOUSEBUTTONDOWN:
                    mousePress(event.button);
                    break;
                case SDL_WINDOWEVENT:
                    windowChanged(event.window);
                    break;
            }
        }
    }
    QUIT();
    return 0;
} /* main */

void GAMELOOP() {
    keystate = SDL_GetKeyboardState(NULL);
} /* GAMELOOP */

void mousePress(SDL_MouseButtonEvent b){ // Debug prop
    if (b.button == SDL_BUTTON_LEFT) {
        printf("Left mouse pressed at %d, %d\n", b.x, b.y);
    } else if (b.button == SDL_BUTTON_RIGHT) {
        printf("Right mouse pressed...\n");
    } else {
        printf("Unknown mouse button pressed: %d\n", b.button);
    }
}

void keyPress(SDL_KeyboardEvent b){ // Debug prop
    printf("Key pressed: ID is %d\n", b.keysym.scancode);
    if (b.keysym.scancode == SDL_SCANCODE_F11) {
        toggleFullscreen();
    }
}

void toggleFullscreen(){
    if (fullscreen) {
        SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
    } else {
        SDL_SetWindowFullscreen(window, 0);
    }
    fullscreen = !fullscreen;
}

void windowChanged(SDL_WindowEvent b){ // Debug prop
    switch (b.event) {
        case SDL_WINDOWEVENT_SIZE_CHANGED:
            printf("Window was resized to (%d|%d)!\n", event.window.data1, event.window.data2);
            break;
    }
}

void DrawFrame(){
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);

    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    // BALL_DRAW();
    SDL_RenderPresent(renderer);

    SDL_RenderPresent(renderer);
}

void INITIALIZE() {
    srand(time(NULL));
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
    else printf("SDL was successfully initialized!\n");
    if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) printf("IMG could not initialize! IMG_Error: %s\n", IMG_GetError());
    else printf("IMG was successfully initialized!\n");
    TTF_Init();

    window = SDL_CreateWindow("BreakING", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
    SDL_SetWindowResizable(window, true);
    printf("Window was created!\n");
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    printf("Renderer was created!\n");
} /* INITIALIZE */

void QUIT(){
    printf("De-initializing started...\n");
    free(keystate);
    TTF_Quit();
    IMG_Quit();
    printf("Quitting SDL_IMG finished!\n");
    SDL_DestroyRenderer(renderer);
    printf("De-initializing renderer finished!\n");
    SDL_DestroyWindow(window);
    printf("De-initializing window finished!\n");
    SDL_Quit();
    printf("Quitting SDL finished!\n");
    printf("De-initializing finished!\n");
} /* QUIT */
