program AppSkeleton ;
const
  SDL_WINDOW_SHOWN = 4;
  SDL_RENDERER_ACCELLERATED = 2;
  SDL_QUIT = 256;
  SDL_KEYDOWN = 768;
  SDLK_ESCAPE = 27;
  WIDTH = 1280;
  HEIGHT = 720;
  title = 'Space';
  filename = 'font.ttf';
  EXIT_FAILURE = 1;
  SCALE_W = 640;
  SCALE_H = 360;
  BLOCK_W = 22;
  BLOCK_H = 24;
  BLOCK_TOTAL = BLOCK_W * BLOCK_H;  
var
running: boolean;
event_type_result: integer;
color_value_r,  color_value_g, color_value_b: integer;
window_id, renderer, target_id:  integer;
font_id: integer;
blocks: array[0..BLOCK_TOTAL] of integer;
color: array[0..3] of integer;
function indexAt(xval, yval: integer): integer;
begin
    indexAt := yval * BLOCK_W + xval;
end;
procedure setcolor(color_index: integer);
begin
    case color_index of
        0: begin color[0] := 255;   color[1] := 255;   color[2] := 0;   end;
        1: begin color[0] := 255; color[1] := 0;   color[2] := 0;   end;
        2: begin color[0] := 0;   color[1] := 255; color[2] := 0;   end;
        3: begin color[0] := 0;   color[1] := 0;   color[2] := 255; end;
        4: begin color[0] := 255; color[1] := 255; color[2] := 255; end;
    end;
end;
procedure shift_array_left_wrap();
var
  iq, first: integer;
begin
  first := blocks[0];
  for iq := 0 to BLOCK_TOTAL-1 do
  begin
    blocks[iq] := blocks[iq+1];
  end;
  blocks[BLOCK_TOTAL] := first;
end;
procedure render();
var
    ix, iy, block: integer;
begin
    sdl_set_render_target(renderer, target_id);
    for iy := 0 to 21 do
    begin
        for ix := 0 to 20 do
        begin
            block := blocks[indexAt(ix, iy)];
            setcolor(block);
            sdl_set_draw_color(renderer, color[0], color[1], color[2], 255);
            sdl_fill_rect(renderer, ix * 32, iy * 16, 32, 16);
        end; 
    end;
    sdl_draw_text(renderer, font_id, 'Grid Shift', 15, 15, rand() mod 255, rand() mod 255, rand() mod 255, 255);
    shift_array_left_wrap();

end;
procedure init_array();
var
    index: integer;
begin
    for index := 0 to (BLOCK_TOTAL)-1 do
    begin
        blocks[index] := rand() mod 4;
    end;
end;
procedure init(title: string; x,y,w,h: integer);
var
result: integer;
begin
    result := sdl_init();
    if result <> 0 then 
    begin
        writeln('failed to init SDL');
        halt(EXIT_FAILURE);
    end;
    window_id := sdl_create_window(title, x, y, w, h, SDL_WINDOW_SHOWN);
    if window_id = -1 then 
    begin 
        writeln('Could not create window');
        sdl_quit(); 
        halt(EXIT_FAILURE); 
    end;
    renderer := sdl_create_renderer(window_id, -1, SDL_RENDERER_ACCELLERATED);
    if renderer = -1 then 
    begin
        writeln('could not create  renderer');
        sdl_destroy_window(window_id);  
        sdl_quit();
        halt(EXIT_FAILURE);
    end;  
        
    target_id := sdl_create_render_target(renderer, SCALE_W, SCALE_H);
    if target_id = -1 then 
    begin 
        writeln('could not create render target');
        sdl_destroy_window(window_id); 
        sdl_destroy_renderer(renderer);    
        halt(1); 
        sdl_quit();
    end;
    srand(sdl_get_ticks());
    if (sdl_init_text() <> 1) then
    begin
        writeln('Font subsystem failed to load');
        halt(EXIT_FAILURE);
    end;
    font_id := sdl_load_font(filename, 32);
    if (font_id = -1)  then  
    begin
        writeln('failed to open: ', filename);
        halt(EXIT_FAILURE);
    end;
    init_array();
end;
procedure cleanup;
begin
    sdl_destroy_render_target(target_id);
    sdl_destroy_renderer(renderer);
    sdl_destroy_window(window_id);
    sdl_quit_text();
    sdl_quit();
end;
begin
    init(title, 100, 100, WIDTH, HEIGHT);
    running := true;
    while running = true do
    begin
        while sdl_poll_event() <> 0 do
        begin
            event_type_result := sdl_get_event_type();
            if event_type_result = SDL_QUIT then 
                running := false;
            if (event_type_result = SDL_KEYDOWN) and (sdl_get_key_code() = SDLK_ESCAPE) then 
                running := false;
        end;
        sdl_set_draw_color(renderer, 0, 0, 0, 255);
        sdl_clear(renderer);
        render();
        sdl_present_scaled(renderer, target_id, WIDTH, HEIGHT);
    end;
    cleanup;
end.