#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
//#include "Png_Funcs.h"
#include "DEM.h"
#include "OpenGL.h"
//#include "GD.h"

//#include "Terrain.h"
//#include "Life.h"
//#include "OpenGL.h"
//#include "Events.h"

//struct image_attr ia;
//extern int img_allocated = 0;

extern unsigned int Threads;
/*
unsigned int Tid[2] = {0,1};
unsigned int Threads;

void *runall(void *thread_id){
    //printf("launching thread %u\n", *(unsigned int *)thread_id);
    if(*(unsigned int *)thread_id == 0){
        Run_GL();
		//while(1)
		//	sleep(1);
		printf("launched opengl\n");
    }else if(*(unsigned int *)thread_id == 1){
		World_Thread();
		printf("launched world\n");
		//while(!img_allocated)
		//	sleep(1);
        //Run_GL();
		//Adjust_Sea_Level(&ia);
    }else{
        printf("ERROR: incorrent thread_id passed!\n");
        exit(1);
    }
    pthread_exit(NULL);
}

void Manager(){
    int Tcount;
    pthread_t *Threads = (pthread_t *)malloc(sizeof(pthread_t) * 2);
    for(Tcount = 0; Tcount < 2; Tcount++){
        if (pthread_create(&Threads[Tcount], NULL, runall, &Tid[Tcount]) != 0){
            printf("Error: pthread_create failed for thread: %d !\n", Tcount);
            exit(1);
        }
    }
    for(Tcount=0; Tcount<2; Tcount++){
        if (pthread_join(Threads[Tcount], NULL) != 0){
            printf("Error: pthread_join failed for thread: %d !\n", Tcount);
            exit(1);
        }
    }
}
*/


int main(int argc, char **argv){
	//size_t width = Png_Width();
	//size_t height = Png_Height();
	//int format = Png_Format();

	Threads = 4;
	//char *filename = (char *)malloc(strlen("../gebco_08.nc") + 1);
	//strcpy(filename, "../gebco_08.nc");
	char *filename = (char *)malloc(strlen("myout.test") + 1);
	strcpy(filename, "myout.test");


	//struct image_attr ia;

	if( (int)Load_Terrain( (char *)filename) ){
		printf("Load Terrain Error!\n");
		exit(1);
	}
	printf("read!\n");

	glutInit(&argc,argv);
	//Manager();
	World_Thread();

	//printf("here 1\n");
	//printf("w: %zu h: %zu\n", ia.width, ia.height);

	//launch thread to adjust sea level
        //if (pthread_create(&Threads[Tcount], NULL, Adjust_Sea_Level, 0) != 0){
        //    printf("Error: pthread_create failed for thread: %d !\n", Tcount);
        //    exit(1);
        //}


	//launch opengl thread
        //if (pthread_create(&Threads[Tcount], NULL, , 1) != 0){
        //   printf("Error: pthread_create failed for thread: %d !\n", Tcount);
        //    exit(1);
        //}

	//if(Run_GL(&ia)){
	//	printf("Opengl error!\n");
	//	exit(1);
	//}

//	GD_Test(&ia);

	//Load_Life();
	//Start_OpenGL();
	//Start_Events();

	free(filename);

	return 0;
}