#include <SDL3/SDL.h>
#include <iostream>

constexpr int WIDTH  = 900;
constexpr int HEIGHT = 600;
constexpr float SQUARE_SIZE = 40.0f;
constexpr float STEP = 20.0f;
constexpr float WALL_X = 700.0f;
constexpr float WALL_WIDTH = 40.0f;
constexpr float GAP_Y = 240.0f;
constexpr float GAP_HEIGHT = 120.0f;

SDL_Renderer* renderer = nullptr;
SDL_FRect square{80.0f, 180.0f, SQUARE_SIZE, SQUARE_SIZE};
bool gameOver = false;
bool success = false;
int steps = 0;

bool trkZZidom(const SDL_FRect& r){
    bool xCollision = r.x + r.w > WALL_X && r.x < WALL_X + WALL_WIDTH;
    if (!xCollision) return false;
    bool inGap = r.y >= GAP_Y && r.y + r.h <= GAP_Y + GAP_HEIGHT;
    if (inGap) return false;
    return true;
}

bool skoziOdprtino(){
    return square.x > WALL_X + WALL_WIDTH;
}

void narisi(){
    SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);
    SDL_RenderClear(renderer);

    SDL_FRect zgornjiDelZidu{WALL_X, 0, WALL_WIDTH, GAP_Y};
    SDL_FRect spodnjiDelZidu{WALL_X, GAP_Y + GAP_HEIGHT, WALL_WIDTH, HEIGHT - GAP_Y - GAP_HEIGHT};
    SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
    SDL_RenderFillRect(renderer, &zgornjiDelZidu);
    SDL_RenderFillRect(renderer, &spodnjiDelZidu);
    SDL_SetRenderDrawColor(renderer, 80, 150, 80, 255);
    SDL_FRect odprtina{WALL_X, GAP_Y, WALL_WIDTH, GAP_HEIGHT};
    SDL_RenderRect(renderer,&odprtina);
    SDL_SetRenderDrawColor(renderer, 220, 60, 60, 255);
    SDL_RenderFillRect(renderer, &square);
    SDL_RenderPresent(renderer);
}

void premakni(float dx, float dy){
    if (gameOver || success) return;
    SDL_FRect novaPozicija = square;
    novaPozicija.x += dx;
    novaPozicija.y += dy;
    steps++;
    if (trkZZidom(novaPozicija)) {
        gameOver = true;
        std::cout<< "TRK Z ZIDOM!"<<std::endl;
        std::cout<< "Stevilo korakov: "<< steps<< std::endl;
        return;
    }

    if (novaPozicija.x < 0 || novaPozicija.y < 0 ||
        novaPozicija.x + novaPozicija.w > WIDTH || novaPozicija.y + novaPozicija.h > HEIGHT){
        gameOver = true;
        std::cout << "Kvadratek je zapustil igralno polje!\n";
        std::cout << "Stevilo korakov: "<< steps<< std::endl;
        return;
    }

    square = novaPozicija;
    if (skoziOdprtino()){
        success = true;
        std::cout<< "\nUSPESNO!"<<std::endl;
        std::cout<< "Kvadratek je prisel skozi odprtino."<<std::endl;
        std::cout<< "Stevilo korakov: " << steps << std::endl;
    }
    narisi();
    SDL_Delay(80);
}

void naprej(){
    premakni(STEP, 0);
}

void nazaj(){
    premakni(-STEP, 0);
}

void gor(){
    premakni(0, -STEP);
}

void dol(){
    premakni(0, STEP);
}

void programUdelezenca(){
    /*
       TU UDELEZENEC PISE SVOJ PROGRAM.

       Na voljo ima samo:

           naprej();
           nazaj();
           gor();
           dol();

       in C++ zanke.
    */


    // --------------------------------------------------------
    // PRIMER:
    //
    for (int i = 0; i < 35; i++)
         naprej();
    // --------------------------------------------------------


    // ========================================================
    // VAŠA KODA
    // ========================================================



    // ========================================================
}

int main(){
    if (!SDL_Init(SDL_INIT_VIDEO)){
        std::cerr<< "SDL_Init napaka: "<< SDL_GetError() << std::endl;
        return 1;
    }
    SDL_Window* window = nullptr;
    if (!SDL_CreateWindowAndRenderer("Programiranje zank", WIDTH, HEIGHT,
            0, &window, &renderer)){
        std::cerr << "Napaka pri ustvarjanju okna: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }

    narisi();
    programUdelezenca();
    bool running = true;
    while (running){
        SDL_Event event;
        while (SDL_PollEvent(&event)){
            if (event.type == SDL_EVENT_QUIT) running = false;
        }
        SDL_Delay(10);
    }

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