#!/usr/bin/perl
use strict;
use warnings;

use UI::Dialog;
use Term::ReadKey;
use Term::ANSIScreen qw(cls);

my $FileEditor = "/bin/nano";
my $InitDName = "/home/fivemowner/bin/fivem";
my $FIVEMDIR = "/home/fivemowner/fivem_resources";
my $BackupCommand = "/home/fivemowner/FiveMBackup/fivembackup.pl";
my $ScreenLog = "/home/fivemowner/fivem_resources/FiveMScreen.log";
my $Pager = "/usr/bin/less";
my $FMCDir = "/home/fivemowner/FiveMManagementConsole";
my $BackupToolDir = "/home/fivemowner/FiveMBackup";
my $StartupDir = "/home/fivemowner/FiveMStartup";
my $UpdateCommand = "/usr/bin/git pull";
my $BinDir = "/home/fivemowner/bin";
my $DEBUG_MODE = "off";
my $MUDPORT = "5555";

###################################################
# No changes below here
###################################################

my $FMC_ver = "1.0";
my $Record = "false";	# Are results saved?
my $TempDir = "/tmp";
my $RobotName = "";
my $BotVersion = "";
my $UserName = "";
my $ServerStatus = "foo";

sub PrintDebugCommand
{
	if ($DEBUG_MODE eq "off")
	{
		return;
	}
	my $PassedString = shift;
	print "About to run:\n$PassedString\n";
	print "Press Enter To Run This:";
	my $entered = <STDIN>;
}

my $d = new UI::Dialog ( backtitle => "FiveM Management Console v$FMC_ver", height => 20, width => 65, listheight => 5,
	order => [ 'ascii', 'cdialog', 'xdialog' ]);

my $windowtitle = "Welcome to the FiveM Management Console!";
my $enjoyedtitle = "We hope you enjoyed FMC!";
my $introtext =
"This is the FiveM Management Console, a utility for FiveM operators
to manage their servers from a text GUI rather than the command line.";

$d->msgbox( title => $windowtitle, text => $introtext );

if (($d->state() eq "ESC") || ($d->state() eq "CANCEL"))
{
	exit 0;
}

my $menuselection = "";

sub CheckServerStatus
{
	my $running=`ps ax|grep server.cfg|grep -v grep`;
	if ($running ne "")
	{
		$ServerStatus = "Running";
	}
	else
	{
		$ServerStatus = "Stopped";
	}

}

sub DoUpdate
{
	my $DesiredDir = $_[0];

	# Update desired utility
	chdir ($DesiredDir);
	PrintDebugCommand("Running $UpdateCommand in $DesiredDir\n");
	system("$UpdateCommand");
	print "Press Enter To Continue";
	my $entered = <STDIN>;
}

sub UpdateToolsMenu
{
	my $WantRespawn="ON";
	CheckServerStatus();
	if (-f "$FIVEMDIR/nostart")
	{
		$WantRespawn="OFF";
	}
	$menuselection = $d->menu( title => "Update Tools Menu", text => "Server is $ServerStatus and respawn is $WantRespawn - Select one:",
                            list => [ '1', 'Update FMC',
                                      '2', 'Update Backup',
                                      '3', 'Update Startup',
                                      'q', 'Main Menu' ] );
}

sub UpdateTools
{
	while (-1)
	{
		UpdateToolsMenu();
		if (($menuselection eq "CANCEL") || ($menuselection eq "ESC") || ($menuselection eq "") || ($menuselection eq "q") || ($menuselection eq "Q"))
		{
			return;
		}
		elsif ($menuselection eq "1")
		{
			# Update FMC
			DoUpdate($FMCDir);
		}
		elsif ($menuselection eq "2")
		{
			# Update BackupToolDir
			DoUpdate($BackupToolDir);
		}
		elsif ($menuselection eq "3")
		{
			# Update Startup
			DoUpdate($StartupDir);
			if (! -d $BinDir)
			{
				print "Binary dir $BinDir not found, creating...\n";
				system("mkdir -p $BinDir");
			}
			system("cp $StartupDir/fivem $BinDir");
			system("cp $StartupDir/startfivem $FIVEMDIR");
		}
	}
}

sub MainMenu
{
	my $WantRespawn="ON";
	CheckServerStatus();
	if (-f "$FIVEMDIR/nostart")
	{
		$WantRespawn="OFF";
	}

	$menuselection = $d->menu( title => "Main Menu", text => "Server is $ServerStatus and respawn is $WantRespawn - Select one:",
                            list => [ '1', 'Start Watchdog',
                                      '2', 'Stop Watchdog',
                                      '3', 'Server Console',
                                      '4', 'Turn Off Respawn',
                                      '5', 'Turn Respawn On',
                                      '6', 'Edit FiveM Config',
                                      '7', 'Backup FiveM',
                                      '8', 'View Screen Log',
                                      '9', 'Kill FiveM Process',
                                      '10', 'Update Utils',
                                      'q', 'Quit FMC' ] );
}

while (-1)
{
	MainMenu();
	if (($menuselection eq "CANCEL") || ($menuselection eq "ESC") || ($menuselection eq "") || ($menuselection eq "q") || ($menuselection eq "Q"))
	{
		$d->msgbox( title => $enjoyedtitle, text => "Thanks for using FMC..." );
		exit 0;
	}
	if ($menuselection eq "1")
	{
                if ($d->yesno( text => "Confirm starting the server watchdog", text => "Are you sure you want to start the server watchdog? You should likely use option #9 instead..." ))
                {
                        system("$InitDName start");
                        sleep(10);
                }
	}
	elsif ($menuselection eq "2")
	{
		if ($d->yesno( text => "Confirm stopping the server watchdog", text => "Are you sure you want to shut down the server watchdog?" ))
		{
			system("$InitDName stop");
			sleep(5);
		}
	}
	elsif ($menuselection eq "3")
	{
		$d->msgbox( text => "To exit the FiveM console and return to FMC press CTRL-A CTRL-D" );
		system("screen -r FiveM");
	}
	elsif ($menuselection eq "4")
	{
		# Turn off respawn
		system("touch $FIVEMDIR/nostart");
	}
	elsif ($menuselection eq "5")
	{
		# Turn respawn back on
		if (-f "$FIVEMDIR/nostart")
		{
			unlink("$FIVEMDIR/nostart");
		}
	}
	elsif ($menuselection eq "6")
	{
		# Edit FiveM config file
		system("$FileEditor $FIVEMDIR/server.cfg");
	}
	elsif ($menuselection eq "7")
	{
                # Run a backup
                system("clear");
                system("$BackupCommand");
                print "Press Enter To Continue";
                my $entered = <STDIN>;
	}
	elsif ($menuselection eq "8")
	{
                # View the log file
                system("$Pager $ScreenLog");
	}
	elsif ($menuselection eq "9")
	{
		my $running=`ps ax|grep server.cfg|grep -v grep`;
	        if ($running ne "")
		{
			# Process is running, kill it
			system("killall server.cfg");
			sleep(5);
		}
	}
	elsif ($menuselection eq "10")
	{
		# Update Menu
		UpdateTools();
	}

}

exit 0;
