#include <glib.h>
#include <clutter/clutter.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

static int width = 720;
static int height = 576;

// global clutter vars
static ClutterActor            *stage = NULL;
static ClutterTimeline         *intervalTimeline = NULL;
static ClutterActor            *newActor = NULL;
static ClutterActor            *previousActor = NULL;

static int currentPic = 0;
static char **filenames;
static int nrOfFiles = 0;

static void intervalCallback( ClutterTimeline *timeline, gpointer user_data ) {
    /// ---- add new actor --------------------------------------
    printf( "intervalCallback - add new actor -------------------------------------\n" );

    if( currentPic == nrOfFiles ) {
        // exit
        clutter_main_quit();
        return;
    }

    char *filename = filenames[currentPic];
    currentPic++;

    if( newActor != NULL ) {
        previousActor = newActor;
    }
    newActor = clutter_texture_new();
    clutter_texture_set_from_file( CLUTTER_TEXTURE(newActor), filename, NULL );
    printf( "image loaded into texture from file %s\n", filename );

    if( newActor ) {
        clutter_actor_set_size( newActor, width, height );
        clutter_actor_set_position( newActor, 0, 0 );
        clutter_group_add( CLUTTER_GROUP(stage), newActor );

        /// ---- remove old actor ---------------------------------
        if( previousActor != NULL ) {
            printf( "free old-actor\n" );
            clutter_actor_destroy( previousActor ); // also removes the actor from its container
        } // else ignore

    } else {
        printf( "ERROR - could not load file %s\n", filename );
    }
    printf( "intervalCallback - done\n" );
}

int main( int argc, char *argv[] ) {
    if( argc != 2 ) {
        printf( "usage: %s <dir-with-images>\n", argv[0] );
        return 1;
    }
    printf( "START\n" );
    clutter_init( &argc, &argv );

    // scan the given dir for files (assumes that only images are in the dir)
    char *srcDir = argv[1];

    GDir *dir = g_dir_open( srcDir, 0, NULL );
    filenames = g_new0( char*, 300 );
    gchar *filename;
    nrOfFiles = 0;
    while( (filename=g_dir_read_name(dir)) != NULL ) {
        filenames[nrOfFiles++] = g_strconcat( srcDir, "/", filename, NULL );
    }
    g_dir_close( dir );
    printf( "Read %d files from %s\n", nrOfFiles, srcDir );

    // add the stage
    printf( "Construct stage with size %dx%d\n", width, height );
    ClutterColor bgcolor = { 0x0, 0x0, 0x0, 0xff };
    stage = clutter_stage_get_default();
    clutter_actor_set_size( stage, width, height );
    clutter_stage_set_color( CLUTTER_STAGE(stage), &bgcolor );
    clutter_actor_show( stage );

    // add callback to quit with a key pressed
    g_signal_connect( stage, "key-press-event", G_CALLBACK(clutter_main_quit), NULL );

    // add a timeline that adds the images after a certain timeout
    intervalTimeline = clutter_timeline_new_for_duration( 4000 );
    clutter_timeline_set_loop( intervalTimeline, TRUE );
    clutter_timeline_start( intervalTimeline );
    g_signal_connect( intervalTimeline, "completed", G_CALLBACK(intervalCallback), NULL );

    printf( "run mainloop\n" );
    clutter_main();

    printf( "mainloop ended\n" );
    g_object_unref( intervalTimeline );
    g_free( filenames );

    printf( "exit\n" );
    return EXIT_SUCCESS;
}
