#!/usr/bin/env bash

# Exit when any command fails
set -e

# Usage: bin/install --project=[project_name] --network=[docker_network_name] --php=[php_version]
#
# Defaults: project_name = boxuk-wp-skeleton, docker_network_name = boxuk-docker, php_version = 8.2
# All arguments are optional.

# Set defaults
export PROJECT_NAME="boxuk-wp-skeleton"
export DOCKER_NETWORK_NAME="boxuk-docker"
export PHP_VERSION="8.2"
export WORDPRESS_VERSION="6.7"

GREEN='\033[0;32m'
BG_GREEN='\033[42m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# Thanks to: https://stackoverflow.com/a/14203146
for i in "$@"; do
  case $i in
    --project=*)
      export PROJECT_NAME="${i#*=}"
      shift # past argument=value
      ;;
    --network=*)
      export DOCKER_NETWORK_NAME="${i#*=}"
      shift # past argument=value
      ;;
    --php=*)
      export PHP_VERSION="${i#*=}"
      shift # past argument=value
      ;;
    -*|--*)
      echo "Unknown option $i"
      exit 1
      ;;
    *)
      ;;
  esac
done

echo 'Setting up .env vars...';

echo -e "Using ${GREEN}${PROJECT_NAME}${NC} for PROJECT_NAME";
echo -e "Using ${GREEN}${DOCKER_NETWORK_NAME}${NC} for DOCKER_NETWORK_NAME";
echo -e "Using ${GREEN}${PHP_VERSION}${NC} for PHP_VERSION";

envsubst \$PROJECT_NAME,\$DOCKER_NETWORK_NAME,\$PHP_VERSION,\$WORDPRESS_VERSION < .env.dist > .env
envsubst \$PROJECT_NAME < ./docker/app/.env.dist > ./docker/app/.env

if [[ "$(docker network ls | grep ${DOCKER_NETWORK_NAME})" == "" ]] ; then
    echo 'Setting up docker network...';
    docker network create --subnet=192.168.35.0/24 $DOCKER_NETWORK_NAME;
fi

echo 'Stopping any running containers...';

docker compose stop;

# Import .env files so we have access to env vars. docker/app/.env will override the root.
. .env;
. ./docker/app/.env;

echo 'Building docker containers...';

docker compose build;
docker compose up -d;

echo 'Running composer install...';

bin/docker/composer install;

# mu-plugins can interfere with the initial installation process, rewrite the directory to disable them temporarily
mv wp-content/mu-plugins wp-content/mu-plugins-disabled

# Add a trap to always move the directory back to it's original state, this covers:
# - Normal termination (EXIT)
# - Interrupted (INT)
# - Killed (TERM)
# - Hangup (HUP)
trap '[ -d wp-content/mu-plugins-disabled ] && mv wp-content/mu-plugins-disabled wp-content/mu-plugins' EXIT INT TERM HUP

echo 'Installing WordPress...';

until bin/docker/wp core install --url="${WP_HOME}" --title="${PROJECT_NAME}" --admin_user=admin --admin_email=boxuk@example.com --skip-email;
do
    echo 'Waiting for the database...';
done

# Manually move the directory back after the installation
mv wp-content/mu-plugins-disabled wp-content/mu-plugins

echo 'Flushing cache...'
bin/docker/wp cache flush;

cp wp-content/plugins/wp-memcached/object-cache.php wp-content/object-cache.php

while true; do
    read -p "Do you wish to add a hosts entry (you will be prompted for password twice)? [Y/N]" yn

    case $yn in
        [Yy]* )
            echo "Please enter your admin username";
            read -p "Username: " ADMIN_USERNAME;
            su - $ADMIN_USERNAME -c "echo '127.0.0.1 ${PROJECT_NAME}.local' | sudo tee -a /etc/hosts";
            break;;
        [Nn]* ) break;;
        * ) echo "Please answer yes or no.";;
    esac
done

# Ask user for password for admin account for WP
read -s -p "Enter a password to setup WP admin account: " ADMIN_PASSWORD
echo -e "\nSetting password...";
bin/docker/wp user update admin --user_pass=$ADMIN_PASSWORD

# Enable Xdebug
echo 'Enabling Xdebug..';
docker compose exec app bash -c "sed -i 's/xdebug.mode=Off/xdebug.mode=debug/' /usr/local/etc/php/conf.d/php.ini; exit;"
docker compose restart app

clear;
# Art generated: https://patorjk.com/software/taag/#p=display&v=0&c=echo&f=Standard&t=Installation%0AComplete
echo -e "${BOLD}";
echo -e "  ___           _        _ _       _   _             ";
echo -e " |_ _|_ __  ___| |_ __ _| | | __ _| |_(_) ___  _ __  ";
echo -e "  | || '_ \/ __| __/ _\` | | |/ _\` | __| |/ _ \| '_ \ ";
echo -e "  | || | | \__ \ || (_| | | | (_| | |_| | (_) | | | |";
echo -e " |___|_| |_|___/\__\__,_|_|_|\__,_|\__|_|\___/|_| |_|";
echo -e "                                                     ";
echo -e "   ____                      _      _                ";
echo -e "  / ___|___  _ __ ___  _ __ | | ___| |_ ___          ";
echo -e " | |   / _ \| '_ \` _ \| '_ \| |/ _ \ __/ _ \         ";
echo -e " | |__| (_) | | | | | | |_) | |  __/ ||  __/         ";
echo -e "  \____\___/|_| |_| |_| .__/|_|\___|\__\___|         ";
echo -e "                      |_|                            ";
echo -e "${NC}";

echo -e "${GREEN}Site administrator.${NC}"
echo -e "The email will be \"boxuk@example.com\", the password as your input above.\n";
echo -e "\n${GREEN}Visit site:";
echo -e "${NC}${WP_HOME}";
echo -e "\n${GREEN}Visit admin:";
echo -e "${NC}${WP_HOME}/wp-admin";
