#!/bin/bash
# Creator: Phil Cook
# Email: phil@phil-cook.com
# Twitter: @p_cook
brew_prefix=$(brew --prefix | sed 's#/#\\\/#g')

brew_array=("5.6","7.0","7.1","7.2","7.3","7.4","8.0","8.1","8.2")
php_array=("php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3" "php@7.4" "php@8.0" "php@8.1" "php@8.2")
valet_support_php_version_array=("php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3" "php@7.4" "php@8.0" "php@8.1" "php@8.2")
php_installed_array=()
php_version="php@$1"
php_opt_path="$brew_prefix\/opt\/"

php5_module="php5_module"
apache_php5_lib_path="\/lib\/httpd\/modules\/libphp5.so"
php7_module="php7_module"
apache_php7_lib_path="\/lib\/httpd\/modules\/libphp7.so"
php8_module="php_module"
apache_php8_lib_path="\/lib\/httpd\/modules\/libphp.so"
native_osx_php_apache_module="LoadModule php5_module libexec\/apache2\/libphp5.so"

php_module="$php5_module"
apache_php_lib_path="$apache_php5_lib_path"

# Has the user submitted a version required
if [[ -z "$1" ]]
then
	echo "usage: sphp version [-s|-s=*] [-c=*]"; echo;
	echo "    version    one of:" ${brew_array[@]};
	echo "    -s         skip change of mod_php on apache";
	echo "    -s=*         skip change of mod_php on apache or valet restart i.e (apache|valet,apache|valet)";
	echo "    -c=*         switch a specific config (apache|valet,apache|valet"; echo;
	exit
fi

if [ $(echo "$php_version" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]; then
	php_module="$php7_module"
	apache_php_lib_path="$apache_php7_lib_path"
fi

apache_change=1
apache_conf_path="/usr/local/etc/httpd/httpd.conf"
apache_php_mod_path="$php_opt_path$php_version$apache_php_lib_path"

valet_restart=0
# Check if valet is already install
hash valet 2>/dev/null && valet_installed=1 || valet_installed=0

POSITIONAL=()

# Check for skip & change flag
while [[ $# -gt 0 ]]; do
    key="$1"
    case "$key" in
        # This is a flag type option. Will catch either -s or --skip
        -s|-s=*|--skip=*)
        if  [[  "${1#*=}" == "-s" || "${1#*=}" == *"apache"* ]]; then
            apache_change=0
        elif [ "${1#*=}" == "valet" ]; then
            valet_restart=0
        fi
        ;;
        # This is a flag type option. Will catch either -c or --change
        -c=*|--change=*)
             [[ "$1" == *"apache"* ]] && apache_change=1 || apache_change=0
             [[ "$1" == *"valet"* ]] && valet_restart=1 || valet_restart=0
        ;;
        *)
        POSITIONAL+=("$1") # save it in an array for later
        ;;
    esac
    # Shift after checking all the cases to get the next option
    shift
done

# What versions of php are installed via brew
for i in ${php_array[*]}
	do
		if [[ -n "$(brew ls --versions "$i")" ]]
		then
			php_installed_array+=("$i")
		fi
done

# Check if php version support via valet
if [[ (" ${valet_support_php_version_array[*]} " != *"$php_version"*) && ($valet_restart -eq 1) ]]
then
    echo "Sorry, but $php_version is not support via valet";
    exit;
fi

# Check that the requested version is supported
if [[ " ${php_array[*]} " == *"$php_version"* ]]
then
	# Check that the requested version is installed
	if [[ " ${php_installed_array[*]} " == *"$php_version"* ]]
	then

	    # Stop valet service
		if [[ ($valet_installed -eq 1) && ($valet_restart -eq 1) ]]; then
		   echo "Stop Valet service";
		   valet stop;
		fi

		# Switch Shell
		echo "Switching to $php_version"
		echo "Switching your shell"
		for i in ${php_installed_array[@]}
		do
			if [[ -n $(brew ls --versions $i) ]]
			then
				brew unlink $i
			fi
		done
		brew link --force "$php_version"

		# Switch apache
		if [[ $apache_change -eq 1 ]]; then
			echo "Switching your apache conf"

			for j in ${php_installed_array[@]}
			do
				loop_php_module="$php5_module"
				loop_apache_php_lib_path="$apache_php5_lib_path"
				if [ $(echo "$j" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]; then
					loop_php_module="$php7_module"
					loop_apache_php_lib_path="$apache_php7_lib_path"
				fi
				apache_module_string="LoadModule $loop_php_module $php_opt_path$j$loop_apache_php_lib_path"
				comment_apache_module_string="#$apache_module_string"

				# If apache module string within apache conf
				if grep -q "$apache_module_string" "$apache_conf_path"; then
					# If apache module string not commented out already
					if ! grep -q "$comment_apache_module_string" "$apache_conf_path"; then
						sed -i.bak "s/$apache_module_string/$comment_apache_module_string/g" $apache_conf_path
					fi
				# Else the string for the php module is not in the apache config then add it
	 			else
					sed -i.bak "/$native_osx_php_apache_module/a\\
$comment_apache_module_string\\
" $apache_conf_path
				fi
			done
			sed -i.bak "s/\#LoadModule $php_module $apache_php_mod_path/LoadModule $php_module $apache_php_mod_path/g" $apache_conf_path
			echo "Restarting apache"
			brew services restart httpd
		fi


        # Switch valet
		if [[ $valet_restart -eq 1 ]]; then
		    if [[ valet_installed -eq 1 ]]; then
                valet restart
             else
               echo "valet doesn't installed in your system, will skip restarting valet service";
            fi
        fi

        echo ""
        php -v
        echo ""

		echo "All done!"
	else
		echo "Sorry, but $php_version is not installed via brew. Install by running: brew install $php_version"
	fi
else
	echo "Unknown version of PHP. PHP Switcher can only handle arguments of:" ${brew_array[@]}
fi