#!/bin/bash

# © 2025 Mirarus All rights reserved.
# Ali Güçlü <aliguclutr@gmail.com>

#----------------------#
if [ "$2" == "-qPort" ] && [ -n "$3" ]; then
	app_server_qPort="$3"
fi

if [ "$4" == "-fPort" ] && [ -n "$5" ]; then
	app_server_fPort="$5"
fi

if [ "$4" == "-passwd" ] && [ -n "$5" ]; then
	app_server_passwd="$5"
fi

if [ "$6" == "-passwd" ] && [ -n "$7" ]; then
	app_server_passwd="$7"
fi
#----------------------#
operationSystem=$(lsb_release -si)
#----------------------#
user="mirarus"
app_home_dir="/home/${user}"
app_repo_dir="/opt/${user}"
app_pack_file="${app_home_dir}/pack.txt"
app_ts_server_dir="${app_repo_dir}/ts_server/"
app_ts_server_port_dir="${app_ts_server_dir}${app_server_qPort}"
#----------------------#
app_repo_url="https://repo.aliguclu.dev/"
#----------------------#
style_reset="\033[0m"
style_red="\033[31;01m"
style_green="\033[32;01m"
style_yellow="\033[33;01m"
style_blue="\033[34;01m"
style_magenta="\033[35;01m"
style_cyan="\033[36;01m"
style_white="\033[37;01m"
style_white_ul="\033[37;04m"
#----------------------#

function app_usage() {
	clear
	clear
	echo -e "${style_green}Usage:${style_reset} ${style_red}$0${style_reset} ${style_green}Options... [Command]${style_reset}"
	echo
	echo
	echo -e "${style_yellow}Commands:${style_reset}"
	echo -e "  ${style_white}install${style_reset}   | ${style_magenta}Server Install${style_reset}"
	echo -e "  ${style_white}reinstall${style_reset} | ${style_magenta}Server Reinstall${style_reset}"
	echo -e "  ${style_white}start${style_reset}     | ${style_magenta}Server Start${style_reset}"
	echo -e "  ${style_white}stop${style_reset}      | ${style_magenta}Server Stop${style_reset}"
	echo -e "  ${style_white}restart${style_reset}   | ${style_magenta}Server Restart${style_reset}"
	echo -e "  ${style_white}password${style_reset}  | ${style_magenta}Server Query Password Change${style_reset}"
	echo -e "  ${style_white}delete${style_reset}    | ${style_magenta}Server Deletion${style_reset}"
	echo -e "  ${style_white}pack${style_reset}      | ${style_magenta}Installing Server Requirements${style_reset}"
	echo -e "  ${style_white}help${style_reset}      | ${style_magenta}How to Use${style_reset}"
	echo
	echo -e "${style_yellow}Options:${style_reset}"
	echo -e "  ${style_white}-qPort${style_reset}    | ${style_magenta}Server Query Port${style_reset}"
	echo -e "  ${style_white}-fPort${style_reset}    | ${style_magenta}Server File Transfer Port${style_reset}"
	echo -e "  ${style_white}-passwd${style_reset}   | ${style_magenta}Server Query Password${style_reset}"
	echo
	echo -e "${style_yellow}Examples:${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} install ${style_yellow}-qPort${style_reset} 10011${style_reset} ${style_yellow}-fPort${style_reset} 30033${style_reset} ${style_yellow}-passwd${style_reset} 12345"
	echo -e "  ${style_white}${style_red}$0${style_reset} reinstall ${style_yellow}-qPort${style_reset} 10011${style_reset} ${style_yellow}-fPort${style_reset} 30033${style_reset} ${style_yellow}-passwd${style_reset} 12345"
	echo -e "  ${style_white}${style_red}$0${style_reset} start ${style_yellow}-qPort${style_reset} 10011${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} stop ${style_yellow}-qPort${style_reset} 10011${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} restart ${style_yellow}-qPort${style_reset} 10011${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} password ${style_yellow}-qPort${style_reset} 10011${style_reset} ${style_yellow}-passwd${style_reset} 12345"
	echo -e "  ${style_white}${style_red}$0${style_reset} delete ${style_yellow}-qPort${style_reset} 10011${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} pack${style_reset}"
	echo -e "  ${style_white}${style_red}$0${style_reset} help${style_reset}"
	echo
	echo -e "${style_yellow}© 2025${style_reset} ${style_yellow}${style_white_ul}Mirarus${style_reset}${style_reset} ${style_cyan}All rights reserved.${style_reset}"
	exit 1
}

function app_pack() {
	clear
	clear

	if [ ! -f $app_pack_file ]; then
		echo "Temel bileşenler kuruluyor."

		if [[ $operationSystem == 'Ubuntu' || $operationSystem == 'Debian' ]]; then
			sudo apt-get upgrade -y
			sudo apt-get update -y
			sudo apt-get install curl -y -q
			sudo apt-get install wget -y -q
			sudo apt-get install python -y -q
			sudo apt-get install bzip2 -y -q
			sudo apt-get install libnice -y -q
			sudo apt-get install ffmpeg -y -q
			sudo update-ca-certificates -y -q
		elif [[ $operationSystem == 'CentOS' ]]; then
			sudo yum upgrade -y -q
			sudo yum update -y -q
			sudo yum install curl -y -q
			sudo yum install wget -y -q
			sudo yum install python -y -q
			sudo yum install bzip2 -y -q
			sudo yum install libnice -y -q
			sudo yum install ffmpeg -y -q
			sudo update-ca-certificates -y -q
		else
			echo "Geçersiz işletim sistemi."
			exit
		fi

		if [ ! -d $app_home_dir ]; then
			useradd -N -m -r -p "$(openssl passwd -1 '218937182937189237189273128937183')" "$user"
			sudo groupadd $user
			sudo usermod -aG $user $user
			sudo chown -R $user:$user /opt
			sudo chown -R $user:$user /opt
			sudo chown -R $user:$user /opt
		fi

		if [ ! -d $app_repo_dir ]; then
			mkdir $app_repo_dir
		fi

		if [ ! -d $app_ts_server_dir ]; then
			mkdir $app_ts_server_dir
		fi

		touch $app_pack_file >/dev/null 2>&1
		echo "Temel bileşenler kuruldu."
	fi

	exit
}

function server_install() {
	clear
	clear

	if [ ! -d $app_repo_dir ]; then
		mkdir $app_repo_dir
	fi

	if [ ! -d $app_ts_server_dir ]; then
		mkdir $app_ts_server_dir
	fi

	if [ ! -f $app_pack_file ]; then
		echo "Temel bileşenleri kurunuz."
		exit
	fi

	if [ ! $app_server_qPort ]; then
		echo "Query Port boş bırakılamaz."
		exit
	fi

	if [ ! $app_server_fPort ]; then
		echo "File Port boş bırakılamaz."
		exit
	fi

	if [ ! $app_server_passwd ]; then
		echo "Şifre boş bırakılamaz."
		exit
	fi

	if [ ! -d $app_ts_server_port_dir ]; then
		echo "Sunucu ${app_server_qPort} portuna kuruluyor."

		mkdir $app_ts_server_port_dir
		sleep 0.5
		cd $app_ts_server_port_dir || exit

		sudo iptables -A INPUT -p tcp --dport "$app_server_qPort" -j ACCEPT >/dev/null 2>&1
		sudo iptables-legacy -A INPUT -p tcp --dport "$app_server_qPort" -j ACCEPT >/dev/null 2>&1
		sudo iptables -A INPUT -p tcp --dport "$app_server_fPort" -j ACCEPT >/dev/null 2>&1
		sudo iptables-legacy -A INPUT -p tcp --dport "$app_server_fPort" -j ACCEPT >/dev/null 2>&1

		nohup wget --no-check-certificate "${app_repo_url}/Server.tar.bz2" >/dev/null 2>&1
		nohup tar -xvjf "Server.tar.bz2" >/dev/null 2>&1
		rm -rf "Server.tar.bz2"

		sleep 1

		sed -i "s@10101@$app_server_qPort@" config.yml >/dev/null 2>&1
		sed -i "s@10011@$app_server_qPort@" config.yml >/dev/null 2>&1
		sed -i "s@30303@$app_server_fPort@" config.yml >/dev/null 2>&1
		sed -i "s@30033@$app_server_fPort@" config.yml >/dev/null 2>&1

		rm -rf nohup.out >/dev/null 2>&1
		chmod +x $app_ts_server_port_dir/*

		sleep 1

		echo "dummy_crash" | ./teastart_minimal.sh
		sleep 1
		./teastart.sh start
		sleep 1
		./teastart.sh execute passwd $app_server_passwd $app_server_passwd

		echo -e "Sunucu ${app_server_qPort} portuna kuruldu."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

function server_Reinstall() {
	clear
	clear

	# Gerekli dizinleri oluştur
	if [ ! -d "$app_repo_dir" ]; then
		mkdir -p "$app_repo_dir"
	fi

	if [ ! -d "$app_ts_server_dir" ]; then
		mkdir -p "$app_ts_server_dir"
	fi

	if [ ! -f "$app_pack_file" ]; then
		echo "Temel bileşenleri kurunuz."
		exit 1
	fi

	# Gerekli değişken kontrolleri
	if [ -z "$app_server_qPort" ]; then
		echo "Query Port boş bırakılamaz."
		exit 1
	fi

	if [ -z "$app_server_fPort" ]; then
		echo "File Port boş bırakılamaz."
		exit 1
	fi

	if [ -z "$app_server_passwd" ]; then
		echo "Şifre boş bırakılamaz."
		exit 1
	fi

	# Eğer belirtilen portta bir sunucu zaten varsa, onu sil
	if [ -d "$app_ts_server_port_dir" ]; then
		echo "Bu portta (${app_server_qPort}) kurulu bir sunucu bulundu. Kaldırılıyor..."

		# Sunucuyu durdur
		if [ -f "$app_ts_server_port_dir/teastart.sh" ]; then
			cd "$app_ts_server_port_dir" || exit
			./teastart.sh stop >/dev/null 2>&1
		fi

		# Sunucu dosyalarını temizle
		rm -rf "$app_ts_server_port_dir"

		echo "Eski sunucu başarıyla kaldırıldı."
	fi

	# Yeni sunucu kurulumu
	echo "Sunucu ${app_server_qPort} portuna kuruluyor."

	mkdir -p "$app_ts_server_port_dir"
	sleep 0.5
	cd "$app_ts_server_port_dir" || exit

	# Firewall ayarlarını yap
	sudo iptables -A INPUT -p tcp --dport "$app_server_qPort" -j ACCEPT >/dev/null 2>&1
	sudo iptables-legacy -A INPUT -p tcp --dport "$app_server_qPort" -j ACCEPT >/dev/null 2>&1
	sudo iptables -A INPUT -p tcp --dport "$app_server_fPort" -j ACCEPT >/dev/null 2>&1
	sudo iptables-legacy -A INPUT -p tcp --dport "$app_server_fPort" -j ACCEPT >/dev/null 2>&1

	# Sunucu dosyalarını indir ve çıkar
	nohup wget --no-check-certificate "${app_repo_url}/Server.tar.bz2" >/dev/null 2>&1
	nohup tar -xvjf "Server.tar.bz2" >/dev/null 2>&1
	rm -rf "Server.tar.bz2"

	sleep 1

	# Yapılandırma dosyalarını güncelle
	sed -i "s@10101@$app_server_qPort@" config.yml >/dev/null 2>&1
	sed -i "s@10011@$app_server_qPort@" config.yml >/dev/null 2>&1
	sed -i "s@30303@$app_server_fPort@" config.yml >/dev/null 2>&1
	sed -i "s@30033@$app_server_fPort@" config.yml >/dev/null 2>&1

	rm -rf nohup.out >/dev/null 2>&1
	chmod +x "$app_ts_server_port_dir/"*

	sleep 1

	# Sunucuyu başlat
	echo "dummy_crash" | ./teastart_minimal.sh
	sleep 1
	./teastart.sh start
	sleep 1
	./teastart.sh execute passwd "$app_server_passwd" "$app_server_passwd"

	echo -e "Sunucu ${app_server_qPort} portuna başarıyla kuruldu."
	exit 0
}


function server_start() {
	clear
	clear

	if [ ! $app_server_qPort ]; then
		echo "Port boş bırakılamaz."
		exit
	fi

	if [ -d $app_ts_server_port_dir ]; then
		cd $app_ts_server_port_dir || exit

		./teastart.sh start

		echo -e "${app_server_qPort} port'lu sunucu başlatıldı."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

function server_stop() {
	clear
	clear

	if [ ! $app_server_qPort ]; then
		echo "Port boş bırakılamaz."
		exit
	fi

	if [ -d $app_ts_server_port_dir ]; then
		cd $app_ts_server_port_dir || exit

		./teastart.sh stop

		echo -e "${app_server_qPort} port'lu sunucu durduruldu."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

function server_restart() {
	clear
	clear

	if [ ! $app_server_qPort ]; then
		echo "Port boş bırakılamaz."
		exit
	fi

	if [ -d $app_ts_server_port_dir ]; then
		cd $app_ts_server_port_dir || exit

		./teastart.sh restart

		echo -e "${app_server_qPort} port'lu sunucu yeniden başlatıldı."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

function server_password_change() {
	clear
	clear

	if [ ! $app_server_qPort ]; then
		echo "Port boş bırakılamaz."
		exit
	fi

	if [ ! $app_server_passwd ]; then
		echo "Şifre boş bırakılamaz."
		exit
	fi

	if [ -d $app_ts_server_port_dir ]; then
		cd $app_ts_server_port_dir || exit

		./teastart.sh execute passwd $app_server_passwd $app_server_passwd

		echo -e "${app_server_qPort} port'lu sunucu şifresi ${app_server_passwd} olarak değiştirildi."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

function server_delete() {
	clear
	clear

	if [ ! $app_server_qPort ]; then
		echo "Port boş bırakılamaz."
		exit
	fi

	if [ -d $app_ts_server_port_dir ]; then
		cd $app_ts_server_port_dir || exit

		./teastart.sh stop

		echo -e "${app_server_qPort} port'lu sunucu durduruldu."

		sleep 1
		rm -rf $app_ts_server_port_dir

		echo -e "${app_server_qPort} port'lu sunucu silindi."
	else
		echo "Bu port'da (${app_server_qPort}) kurulu bir sunucu bulunuyor."
	fi
	exit
}

while [ $# != 0 ]; do
	case $1 in
	install) server_install ;;
	reinstall) server_Reinstall ;;
	start) server_start ;;
	stop) server_stop ;;
	restart) server_restart ;;
	password) server_password_change ;;
	delete) server_delete ;;
	pack) app_pack ;;
	help) app_usage ;;
	esac
	shift
done

app_usage