use strict;
use warnings;
use SDL 2.408;

use SDLx::App; #this is in the github repo.
use SDL::Event;
use SDL::Events;
use SDL::Rect;
use SDL::Video;
use SDL::Surface;
use SDL::PixelFormat;
use SDL::Palette;
use SDL::Color;
use Devel::Peek;

use PDL;

my $app = SDLx::App->new(
	title  => 'Application Title',
	width  => 640,
	height => 480,
	depth  => 32
);
my $mapped_color = SDL::Video::map_RGB( $app->format(), 50, 50, 50 ); # blue

load_app();

my ( $piddle, $surface ) = surf_piddle();
my $ref = $surface->get_pixels_ptr();

my $event = SDL::Event->new;                                          # create a new event

while (1) {
	SDL::Events::pump_events();

	while ( SDL::Events::poll_event($event) ) {
		my $type = $event->type();                                    # get event type
		exit if $type == SDL_QUIT;
	}
	update($piddle);

	SDL::Video::update_rect( $app, 0, 0, $app->w, $app->h );
}

sub load_app {

	SDL::Video::fill_rect(
		$app, SDL::Rect->new( 0, 0, $app->w, $app->h ),
		$mapped_color
	);
	return $app;
}

sub surf_piddle {
	my ( $bytes_per_pixel, $width, $height ) = ( 4, 400, 200 );
	my $piddle  = zeros( byte, $bytes_per_pixel, $width, $height );
	my $pointer = $piddle->get_dataref();
	my $surface = SDL::Surface->new_from(
		$pointer, $width, $height, 32,
		$width * $bytes_per_pixel
	);

	warn "Made surface of $width, $height and " . $surface->format->BytesPerPixel;
	return ( $piddle, $surface );

}

sub update {
	my $piddle = shift;
	load_app();

	SDL::Video::lock_surface($surface);

	$piddle->mslice(
		'X',
		[ rand(400), rand(400), 1 ],
		[ rand(200), rand(200), 1 ]
	) .= pdl( rand(225), rand(225), rand(255), 255 );

	SDL::Video::unlock_surface($surface);

	my $b = SDL::Video::blit_surface(
		$surface,
		SDL::Rect->new( 0, 0, $surface->w, $surface->h ),
		$app,
		SDL::Rect->new(
			( $app->w - $surface->w ) / 2, ( $app->h - $surface->h ) / 2,
			$app->w, $app->h
		)
	);
	die "Could not blit: " . SDL::get_error() if ( $b == -1 );
}
