#include <SDL2/SDL.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    SDL_SetHint(SDL_HINT_VIDEODRIVER, "wayland");

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
        return 1;
    }

    printf("=== SDL2 Wayland Keyboard Test on QNX 8.0 ===\n");
    printf("Video driver     : %s\n", SDL_GetCurrentVideoDriver());
    printf("SDL version      : %d.%d.%d\n", 
           SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL);
    printf("----------------------------------------\n");

    SDL_Window *window = SDL_CreateWindow(
        "SDL2 Keyboard Test - Wayland (QNX)",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        800, 600,
        SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

    if (!window) {
        fprintf(stderr, "Window creation failed: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // Create a renderer + initial render (THIS makes the window appear on Wayland)
    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (!renderer) {
        fprintf(stderr, "Renderer creation failed: %s\n", SDL_GetError());
        // fallback to software if hardware fails
        renderer = SDL_CreateRenderer(window, -1, 0);
    }

    if (renderer) {
        SDL_SetRenderDrawColor(renderer, 30, 30, 40, 255);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
        printf("[INFO] Renderer created and initial frame presented.\n");
    } else {
        printf("[WARNING] Could not create renderer.\n");
    }

    SDL_StopTextInput();

    printf("\nWindow should now be visible.\n");
    printf("Click inside the window to give it focus, then press keys.\n");
    printf("ESC or close the window to quit.\n\n");
    printf("Event      | Scancode | Name                     | Keycode | Key Name\n");
    printf("-------------------------------------------------------------------\n");

    SDL_Event event;
    int running = 1;

    while (running) {
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
                case SDL_QUIT:
                    running = 0;
                    break;

                case SDL_KEYDOWN:
                case SDL_KEYUP:
                    {
                        const char *type_str = (event.type == SDL_KEYDOWN) ? "KEYDOWN " : "KEYUP   ";
                        SDL_Keysym *ks = &event.key.keysym;

                        printf("%s | %-8d | %-24s | %-7d | %s\n",
                            type_str,
                            ks->scancode,
                            SDL_GetScancodeName(ks->scancode),
                            ks->sym,
                            SDL_GetKeyName(ks->sym));
                    }
                    break;

                case SDL_WINDOWEVENT:
                    if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
                        printf("[INFO] Window gained focus\n");
                    break;
            }
        }

        // Keep rendering (required on Wayland to keep the surface alive)
        if (renderer) {
            SDL_RenderPresent(renderer);   // or you can clear again if you want
        }

        SDL_Delay(10);
    }

    if (renderer) SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

