#include <SDL3/SDL.h>
#include <cmath>

constexpr int WINDOW_WIDTH = 800;
constexpr int WINDOW_HEIGHT = 600;

int main(int argc, char* argv[]) {
    if (!SDL_Init(SDL_INIT_VIDEO)) {
        SDL_Log("SDL Initialization failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* window = nullptr;
    SDL_Renderer* renderer = nullptr;

    if (!SDL_CreateWindowAndRenderer("Cyberpunk Plasma - SDL3", WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer)) {
        SDL_Log("Window/Renderer creation failed: %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }

    bool running = true;
    float offset = 0.0f;

    float x = 0;
    float y = 0;

    while (running) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_EVENT_QUIT) {
                running = false;
            }

            if (event.type==SDL_EVENT_KEY_DOWN){
                if (event.key.key==SDLK_LEFT)
                    x -= 10.0;
                if (event.key.key==SDLK_RIGHT)
                    x += 10.0;
                if (event.key.key==SDLK_UP)
                    y -= 10.0;
                if (event.key.key==SDLK_DOWN)
                    y += 10.0;
                if (event.key.key==SDLK_M)
                    offset += 1.0f;
            }
        }
        
        SDL_SetRenderDrawColor(renderer, 10, 15, 30, 255);
        SDL_RenderClear(renderer);

        offset += 0.03f;
        
        for (int x = 0; x < WINDOW_WIDTH; x += 8) {
            for (int y = 0; y < WINDOW_HEIGHT; y += 8) {
                SDL_FRect square = {
                    .x = static_cast<float>(x),
                    .y = static_cast<float>(y),
                    .w = 7.0f,
                    .h = 7.0f
                };

                // Mathematical sine-wave magic for smooth, organic color shifting
                float fx = static_cast<float>(x) * 0.01f;
                float fy = static_cast<float>(y) * 0.01f;

                Uint8 red = static_cast<Uint8>((std::sin(fx + offset) + 1.0f) * 127.5f);
                Uint8 green = static_cast<Uint8>((std::cos(fy + offset * 0.5f) + 1.0f) * 127.5f);
                Uint8 blue = static_cast<Uint8>((std::sin(fx + fy + offset * 1.5f) + 1.0f) * 127.5f);

                SDL_SetRenderDrawColor(renderer, red, green, blue, 255);
                SDL_RenderFillRect(renderer, &square);
            }
        }

        SDL_FRect square = {
            .x = x,
            .y = y,
            .w = 100,
            .h = 100
        };

        SDL_SetRenderDrawColor(renderer, 255, 192, 203, 255);
        SDL_RenderFillRect(renderer, &square);

        SDL_RenderPresent(renderer);
        SDL_Delay(16); // Cap at roughly 60 FPS for smooth animation
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}