#!/bin/bash

## Funzioni utilizzate da build

#Stampa i comandi possibili
function help() {
	printf "\n"
	printf "build [-h] -[ptl] -[DCcfs] [config_file]\n"
	printf "\n"
	printf "Specificare il config_file solo se non si desidera utilizzare quello di default.\n"
	printf "E' obbligatorio specificare l'environment. In caso di environment multipli sarà utilizzato solo quello a priorità maggiore.\n"
	printf "L'opzione default di database è -f (fix).\n"
	printf "\n"
	printf "Possibili valori di option\n"
	printf "\t -h questa schermata\n"
	printf "\n"
	printf "Lista environment (per deployare la configurazione) in ordine di priorità\n"
	printf "\t -p Produzione\n"
	printf "\t -t Test\n"
	printf "\t -l Locale\n"
	printf "\n"
	printf "Opzioni database\n"
	printf "\t -D Droppa tutto il database e lo rebuilda\n"
	printf "\t -C Droppa le tabelle di contenuti e le rebuilda\n"
	printf "\t -c Droppa le tabelle di configurazione e le rebuilda\n"
	printf "\t -f Aggiunge le tabelle mancanti\n"
	printf "\t -s Skip db fix\n"
}

#Stampa il nome del comando in esecuzione
function printcmd () {
	printf "*-----------------------------------------*\n"
	printf "   PROJECT:  $PROJECT_NAME\n"
	printf "   EXECUTING: $1\n"
	printf "\n"
	printf "*-----------------------------------------*\n"
}



# Imposta come proprietario della cartella l'utente apache
function chown_folder() {
	if [[ -z "$1" ]] || [[ "$1" == "/" ]] || [[ "$1" == "./" ]]; then
                exit 1
	else
		chown -R $APACHE2_USER:$APACHE2_GROUP "$1"
	fi
}

function svncleanup() {
	if [[ -z "$1" ]] || [[ "$1" == "/" ]] || [[ "$1" == "./" ]]; then
		exit 1
	else
		for i in `find "$1" -name .svn`; 
		do
			printf  "Deleting .. $i\n"
			rm -rf "$i"
		done
	fi
}

# Crea le cartelle di sistema
function create_project_fs(){
	# CREATES APPLICATION PRIVATE FOLDER
	mkdir -p $APPLICATION_PRIVATE
	chown_folder $APPLICATION_PRIVATE
	
	# CREATES APPLICATION PUBLIC FOLDER
	mkdir -p $APPLICATION_PUBLIC
	chown_folder $APPLICATION_PUBLIC

	# CREATES APPLICATION STORAGE FOLDER
	mkdir -p $APPLICATION_STORAGE
	chown_folder $APPLICATION_STORAGE

	# CREATES APPLICATION LOG FOLDER
	mkdir -p $APPLICATION_LOG_PATH
	chown_folder $APPLICATION_LOG_PATH

	# CREATES XSENDFILE FOLDER
	mkdir -p $APPLICATION_XSENDFILE_PATH
	chown_folder $APPLICATION_XSENDFILE_PATH
	
	# CREATES APPLICATION MEDIA FOLDER
	mkdir -p $APPLICATION_MEDIA_PATH
	chown_folder $APPLICATION_MEDIA_PATH
	
	# CREATES APPLICATION BACKUP FOLDER
	mkdir -p $APPLICATION_BACKUPS_PATH
	chown_folder $APPLICATION_BACKUPS_PATH
	
	# CREATES APPLICATION TEMPORARY FOLDER
	mkdir -p $APPLICATION_TMP_PATH
	chown_folder $APPLICATION_TMP_PATH
}


# Deploya i sorgenti
function deploy(){
	echo "Deleting old build (Private)"
	rm -rf "$APPLICATION_PRIVATE/*"

	echo "Deleting old build (Public)"
	rm -rf "$APPLICATION_PUBLIC/*"
	

	echo "Deploying new build (Private)"
	cp -a "./private/"* "$APPLICATION_PRIVATE"
	svncleanup "$APPLICATION_PRIVATE"
	chown_folder "$APPLICATION_PRIVATE"
	
	echo "Deploying new build (Public)"
	cp -a "./public/"* "$APPLICATION_PUBLIC"
	svncleanup "$APPLICATION_PUBLIC"
	chown_folder "$APPLICATION_PUBLIC"
	

	chmod -R a+x "$APPLICATION_BINARY_PATH"
	chmod -R a+x "$APPLICATION_CRON_PATH"
#	chmod -R a+x "$APPLICATION_TASK_PATH"
}



# Deploya il progetto e mantiene solo la configurazione di produzione
function deploy_production_env(){
	create_project_fs
	deploy
	if [[ -f "$APPLICATION_CONFIG_PATH/config.local.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.local.php"
	fi
	if [[ -f "$APPLICATION_CONFIG_PATH/config.test.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.test.php"
	fi
}

# Deploya il progetto e mantiene solo la configurazione del server di test
function deploy_test_env(){
	create_project_fs
	deploy
	if [[ -f "$APPLICATION_CONFIG_PATH/config.local.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.local.php"
	fi
	if [[ -f "$APPLICATION_CONFIG_PATH/config.prod.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.prod.php"
	fi
}

# Deploya il progetto e mantiene solo la configurazione locale
function deploy_local_env(){
	create_project_fs
	deploy
	if [[ -f "$APPLICATION_CONFIG_PATH/config.prod.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.prod.php"
	fi
	if [[ -f "$APPLICATION_CONFIG_PATH/config.test.php" ]];then
		rm "$APPLICATION_CONFIG_PATH/config.test.php"
	fi
}

function database_rebuild_content(){
	echo "Function not implemented... faking execution"
	for collection_name in "${!MONGO_DB_CONTENT_COLLECTIONS[@]}"; do 
		echo "Rebuilding collection $collection_name - ${MONGO_DB_CONTENT_COLLECTIONS["$collection_name"]}"; 
	done

	for table_name in "${!MYSQL_DB_CONTENT_TABLES[@]}"; do 
		echo "Rebuilding table '$table_name' using query '${MYSQL_DB_CONTENT_TABLES["$table_name"]}'"; 
	done
}

function database_rebuild_config(){
	echo "Function not implemented... faking execution"
	for collection_name in "${!MONGO_DB_CONFIG_COLLECTIONS[@]}"; do 
		echo "Rebuilding collection $collection_name - ${MONGO_DB_CONFIG_COLLECTIONS["$collection_name"]}"; 
	done

	for table_name in "${!MYSQL_DB_CONFIG_TABLES[@]}"; do 
		echo "Rebuilding table '$table_name' using query '${MYSQL_DB_CONFIG_TABLES["$table_name"]}'"; 
	done
}

function database_add_missing(){
	echo "Function not implemented... faking execution"
	for collection_name in "${!MONGO_DB_CONFIG_COLLECTIONS[@]}"; do 
		echo "Checking collection $collection_name - ${MONGO_DB_CONFIG_COLLECTIONS["$collection_name"]}"; 
	done

	for table_name in "${!MYSQL_DB_CONFIG_TABLES[@]}"; do 
		echo "Checking table '$table_name' using query '${MYSQL_DB_CONFIG_TABLES["$table_name"]}'"; 
	done
}



# Droppa e ricrea solo le tabelle dei dati
function regenerate_db(){
	EXDIR=`pwd`
	cd "$APPLICATION_BINARY_PATH"
	
	./createDatabase
	DBCONN=`./getDbConnectionString`
	
	QUERY="CREATE TABLE campagna (id bigint auto_increment PRIMARY KEY, nome VARCHAR(64), owner bigint not null, creation_date TIMESTAMP default CURRENT_TIMESTAMP, current boolean default false, deleted boolean default false)"
	TABNAME="campagna"
	EXISTS=`echo "show tables" | $DBCONN  | grep "$TABNAME" | wc -l`
	if [[ "$EXISTS" -gt 0 ]];then
		echo "Dropping table $TABNAME"
		echo "DROP TABLE $TABNAME" | $DBCONN
	fi
	echo "Executing query '$QUERY'"
	echo $QUERY | $DBCONN
	
	QUERY="CREATE TABLE personaggio ( id bigint auto_increment PRIMARY KEY, deleted boolean default false, campagna bigint, active boolean default true, nome varchar(128), giocatore varchar(128), vita_cur smallint, vita_max smallint, forza tinyint unsigned, destrezza tinyint unsigned, costituzione tinyint unsigned, intelligenza tinyint unsigned, saggezza tinyint unsigned, carisma tinyint unsigned, ts_tempra smallint, ts_tempra_note varchar(128), ts_riflessi smallint, ts_riflessi_note varchar(128), ts_volonta smallint, ts_volonta_note varchar(128), ca_base tinyint, ca_contatto tinyint, ca_sprovvista tinyint, iniziativa int not null default 0, ascoltare int, ascoltare_note varchar(128), cercare int, cercare_note varchar(128), diplomazia int, diplomazia_note varchar(128), muov_sil int, muov_sil_note varchar(128), nascondersi int, nascondersi_note varchar(128), osservare int, osservare_note varchar(128), perc_intenz int, perc_intenz_note varchar(128), raggirare int, raggirare_note varchar(128), valutare int, valutare_note varchar(128), conoscenze varchar(256), lingue varchar(256), melee_atk_short varchar(512), melee_atk_complete varchar(512), ranged_atk_short varchar(512), ranged_atk_complete varchar(512), unarmed_atk_short varchar(512), unarmed_atk_complete varchar(512), resist_incant smallint default 0, combat_note varchar(512), details TEXT, INDEX(campagna) )"
	TABNAME="personaggio"
	EXISTS=`echo "show tables" | $DBCONN  | grep "$TABNAME" | wc -l`
	if [[ "$EXISTS" -gt 0 ]];then
		echo "Dropping table $TABNAME"
		echo "DROP TABLE $TABNAME" | $DBCONN
	fi
	echo "Executing query '$QUERY'"
	echo $QUERY | $DBCONN
	
	
	QUERY="CREATE TABLE npc( id bigint auto_increment PRIMARY KEY, deleted boolean default false, nome varchar(128), tipo varchar(128), dadi_vita smallint, vita_max smallint, allineamento varchar(32), grado_sfida smallint, forza tinyint unsigned, destrezza tinyint unsigned, costituzione tinyint unsigned, intelligenza tinyint unsigned, saggezza tinyint unsigned, carisma tinyint unsigned, ts_tempra smallint, ts_tempra_note varchar(128), ts_riflessi smallint, ts_riflessi_note varchar(128), ts_volonta smallint, ts_volonta_note varchar(128), ca_base tinyint, ca_contatto tinyint, ca_sprovvista tinyint, iniziativa int not null default 0, ascoltare int, ascoltare_note varchar(128), cercare int, cercare_note varchar(128), muov_sil int, muov_sil_note varchar(128), nascondersi int, nascondersi_note varchar(128), osservare int, osservare_note varchar(128), perc_intenz int, perc_intenz_note varchar(128), raggirare int, raggirare_note varchar(128), valutare int, valutare_note varchar(128), conoscenze varchar(256), lingue varchar(256), melee_atk_short varchar(512), melee_atk_complete varchar(512), ranged_atk_short varchar(512), ranged_atk_complete varchar(512), unarmed_atk_short varchar(512), unarmed_atk_complete varchar(512), resist_incant smallint default 0, combat_note varchar(512), details TEXT )"
	TABNAME="npc"
	EXISTS=`echo "show tables" | $DBCONN  | grep "$TABNAME" | wc -l`
	if [[ "$EXISTS" -gt 0 ]];then
		echo "Dropping table $TABNAME"
		echo "DROP TABLE $TABNAME" | $DBCONN
	fi
	echo "Executing query '$QUERY'"
	echo $QUERY | $DBCONN
	
	cd "$EXDIR"
}

# Droppa e ricrea le tabelle base (tipo admin e config)
function regenerate_db_hard(){
	EXDIR=`pwd`
	cd "$APPLICATION_BINARY_PATH"
	
	./createDatabase
	DBCONN=`./getDbConnectionString`
	
	
	QUERY="CREATE TABLE general_configuration (config_key varchar(128) primary key, config_value varchar(128), INDEX(config_key))"
	TABNAME="general_configuration"
	EXISTS=`echo "show tables" | $DBCONN  | grep "$TABNAME" | wc -l`
	if [[ "$EXISTS" -gt 0 ]];then
		echo "Dropping table $TABNAME"
		echo "DROP TABLE $TABNAME" | $DBCONN
	fi
	echo "Executing query '$QUERY'"
	echo $QUERY | $DBCONN
	
	
	QUERY="CREATE TABLE user (id bigint auto_increment PRIMARY KEY, login varchar(64) not null, password varchar(64) not null, last_session_id varchar(64) default null, is_admin boolean not null default false, INDEX(login), INDEX(last_session_id))"
	TABNAME="user"
	EXISTS=`echo "show tables" | $DBCONN  | grep "$TABNAME" | wc -l`
	if [[ "$EXISTS" -gt 0 ]];then
		echo "Dropping table $TABNAME"
		echo "DROP TABLE $TABNAME" | $DBCONN
	fi
	echo "Executing query '$QUERY'"
	echo $QUERY | $DBCONN
	
	
	cd "$EXDIR"
}



