#!/usr/local/bin/perl

use strict;
use warnings;
use Time::HiRes;

use constant {
	BSPC_PATH		=> '/usr/local/bin/bspc',
	ESPEAK_PATH		=> '/usr/local/bin/espeak',
	ALACRITTY_PATH	=> '/usr/local/bin/alacritty',
	SH_PATH			=> '/bin/sh',
	ZSH_PATH		=> '/usr/local/bin/zsh',
	COWSAY_PATH		=> '/usr/local/bin/cowsay',
	HTOP_PATH		=> '/usr/local/bin/htop',
	GOTOP_PATH		=> '/usr/local/bin/gotop',
	VIFM_PATH		=> '/usr/local/bin/vifm'
};
use constant COWSAY_WELCOME	=> 'Welcome back, partner! And remember to try glest!';

sub run_espeak
{
	my $espeak_pid;

	$espeak_pid = fork();
	if (not $espeak_pid) {
		exec(ESPEAK_PATH, COWSAY_WELCOME);
	}
	return;
}

sub fg_on_three_screens
{
	my @term_pid;

	$term_pid[0] = fork();
	if (not $term_pid[0]) {
		exec(
			ALACRITTY_PATH, '-e', SH_PATH, '-c',
			COWSAY_PATH . ' "' . COWSAY_WELCOME . '"; ' . ZSH_PATH
			);
		exit;
	}
	Time::HiRes::sleep(3.6);
	$term_pid[1] = fork();
	if (not $term_pid[1]) {
		exec(ALACRITTY_PATH, '-e', HTOP_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	$term_pid[2] = fork();
	if (not $term_pid[2]) {
		exec(ALACRITTY_PATH, '-e', GOTOP_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-f', 'west');
	$term_pid[3] = fork();
	if (not $term_pid[3]) {
		exec(ALACRITTY_PATH, '-e', VIFM_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-z', 'right', '180', '0');
	system(BSPC_PATH, 'node', '-z', 'top', '0', '70');
	system(BSPC_PATH, 'node', '-f', 'east');
	system(BSPC_PATH, 'node', '-f', 'north');
	system(BSPC_PATH, 'node', '-z', 'bottom', '0', '-280');
	system(BSPC_PATH, 'node', '-f', 'north');
	system(BSPC_PATH, 'node', '-f', 'west');
	return;
}

sub fg_on_two_screens
{
	my @term_pid;

	$term_pid[0] = fork();
	if (not $term_pid[0]) {
		exec(
			ALACRITTY_PATH, '-e', SH_PATH, '-c',
			COWSAY_PATH . ' "' . COWSAY_WELCOME . '"; ' . ZSH_PATH
			);
		exit;
	}
	Time::HiRes::sleep(3.6);
	$term_pid[1] = fork();
	if (not $term_pid[1]) {
		exec(ALACRITTY_PATH, '-e', HTOP_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	$term_pid[2] = fork();
	if (not $term_pid[2]) {
		exec(ALACRITTY_PATH, '-e', GOTOP_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-f', 'west');
	$term_pid[3] = fork();
	if (not $term_pid[3]) {
		exec(ALACRITTY_PATH, '-e', VIFM_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-z', 'right', '180', '0');
	system(BSPC_PATH, 'node', '-z', 'top', '0', '70');
	system(BSPC_PATH, 'node', '-f', 'east');
	system(BSPC_PATH, 'node', '-f', 'north');
	system(BSPC_PATH, 'node', '-z', 'bottom', '0', '-280');
	system(BSPC_PATH, 'node', '-f', 'north');
	system(BSPC_PATH, 'node', '-f', 'west');
	return;
}

sub fg_on_one_screen
{
	my @term_pid;

	$term_pid[0] = fork();
	if (not $term_pid[0]) {
		exec(
			ALACRITTY_PATH, '-e', SH_PATH, '-c',
			COWSAY_PATH . ' "' . COWSAY_WELCOME . '"; ' . ZSH_PATH
			);
		exit;
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-p', 'west');
	$term_pid[1] = fork();
	if (not $term_pid[1]) {
		exec(ALACRITTY_PATH, '-e', HTOP_PATH);
		exit;
	}
	Time::HiRes::sleep(3.6);
	$term_pid[2] = fork();
	if (not $term_pid[2]) {
		exec(ALACRITTY_PATH, '-e', GOTOP_PATH);
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-f', 'east');
	$term_pid[3] = fork();
	if (not $term_pid[3]) {
		exec(ALACRITTY_PATH, '-e', VIFM_PATH);
	}
	Time::HiRes::sleep(3.6);
	system(BSPC_PATH, 'node', '-f', 'west');
	system(BSPC_PATH, 'node', '-f', 'north');
	system(BSPC_PATH, 'node', '-z', 'bottom', '0', '-200');
	system(BSPC_PATH, 'node', '-z', 'right', '-220', '0');
	system(BSPC_PATH, 'node', '-f', 'east');
	system(BSPC_PATH, 'node', '-z', 'bottom', '0', '70');
	system(BSPC_PATH, 'node', '-f', 'north');
	return;
}

sub run_terms
{
	my ($screens) = @_;

	system(BSPC_PATH, 'desktop', '-f', '09');
	if ($screens == 3) {
		fg_on_three_screens();
	}
	elsif ($screens == 2) {
		fg_on_two_screens();
	}
	else {
		fg_on_one_screen();
	}
	system(BSPC_PATH, 'desktop', '-f', '01');
	return;
}

sub main
{
	run_espeak();
	run_terms($ARGV[0]);
	return;
}

main();

__END__