alias ..="cd .."
alias ...="cd ../.."

alias h='cd ~'
alias c='clear'
alias art=artisan

alias codecept='vendor/bin/codecept'
alias phpspec='vendor/bin/phpspec'
alias pint='vendor/bin/pint'
alias serve=serve-laravel

alias xoff='sudo phpdismod -s cli xdebug'
alias xon='sudo phpenmod -s cli xdebug'

alias nrd="npm run dev"
alias nrw="npm run watch"
alias nrwp="npm run watch-poll"
alias nrh="npm run hot"
alias nrp="npm run production"

alias yrd="yarn dev"
alias yrw="yarn watch"
alias yrwp="yarn watch-poll"
alias yrh="yarn hot"
alias yrp="yarn production"

function artisan() {
    php artisan "$@"
}

function dusk() {
    pids=$(pidof /usr/bin/Xvfb)

    if [ ! -n "$pids" ]; then
        Xvfb :0 -screen 0 1280x960x24 &
    fi

    if [[ $? -eq 0 ]]
    then
        php artisan dusk
    else
        php artisan dusk --filter "$@"
    fi
}

function p() {
    if [ -f vendor/bin/pest ]; then
       vendor/bin/pest "$@"
    else
       vendor/bin/phpunit "$@"
    fi
 }

 function pf() {
    if [ -f vendor/bin/pest ]; then
       vendor/bin/pest --filter "$@"
    else
       vendor/bin/phpunit --filter "$@"
    fi
 }

function php56() {
    sudo update-alternatives --set php /usr/bin/php5.6
    sudo update-alternatives --set php-config /usr/bin/php-config5.6
    sudo update-alternatives --set phpize /usr/bin/phpize5.6
}

function php70() {
    sudo update-alternatives --set php /usr/bin/php7.0
    sudo update-alternatives --set php-config /usr/bin/php-config7.0
    sudo update-alternatives --set phpize /usr/bin/phpize7.0
}

function php71() {
    sudo update-alternatives --set php /usr/bin/php7.1
    sudo update-alternatives --set php-config /usr/bin/php-config7.1
    sudo update-alternatives --set phpize /usr/bin/phpize7.1
}

function php72() {
    sudo update-alternatives --set php /usr/bin/php7.2
    sudo update-alternatives --set php-config /usr/bin/php-config7.2
    sudo update-alternatives --set phpize /usr/bin/phpize7.2
}

function php73() {
    sudo update-alternatives --set php /usr/bin/php7.3
    sudo update-alternatives --set php-config /usr/bin/php-config7.3
    sudo update-alternatives --set phpize /usr/bin/phpize7.3
}

function php74() {
    sudo update-alternatives --set php /usr/bin/php7.4
    sudo update-alternatives --set php-config /usr/bin/php-config7.4
    sudo update-alternatives --set phpize /usr/bin/phpize7.4
}

function php80() {
    sudo update-alternatives --set php /usr/bin/php8.0
    sudo update-alternatives --set php-config /usr/bin/php-config8.0
    sudo update-alternatives --set phpize /usr/bin/phpize8.0
}

function php81() {
    sudo update-alternatives --set php /usr/bin/php8.1
    sudo update-alternatives --set php-config /usr/bin/php-config8.1
    sudo update-alternatives --set phpize /usr/bin/phpize8.1
}

function php82() {
    sudo update-alternatives --set php /usr/bin/php8.2
    sudo update-alternatives --set php-config /usr/bin/php-config8.2
    sudo update-alternatives --set phpize /usr/bin/phpize8.2
}

function php83() {
    sudo update-alternatives --set php /usr/bin/php8.3
    sudo update-alternatives --set php-config /usr/bin/php-config8.3
    sudo update-alternatives --set phpize /usr/bin/phpize8.3
}

function serve-apache() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/apache.sh
        sudo bash /vagrant/scripts/site-types/apache.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-apache domain path"
    fi
}

function serve-apache-proxy() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/apache-proxy.sh
        sudo bash /vagrant/scripts/site-types/apache-proxy.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-apache-proxy domain port"
    fi
}

function serve-laravel() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/laravel.sh
        sudo bash /vagrant/scripts/site-types/laravel.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve domain path"
    fi
}

function serve-proxy() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/proxy.sh
        sudo bash /vagrant/scripts/site-types/proxy.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-proxy domain port"
    fi
}

function serve-silverstripe() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/silverstripe.sh
        sudo bash /vagrant/scripts/site-types/silverstripe.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-silverstripe domain path"
    fi
}

function serve-spa() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/spa.sh
        sudo bash /vagrant/scripts/site-types/spa.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-spa domain path"
    fi
}

function serve-statamic() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/statamic.sh
        sudo bash /vagrant/scripts/site-types/statamic.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-statamic domain path"
    fi
}

function serve-symfony2() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/symfony2.sh
        sudo bash /vagrant/scripts/site-types/symfony2.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-symfony2 domain path"
    fi
}

function serve-symfony4() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/symfony4.sh
        sudo bash /vagrant/scripts/site-types/symfony4.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-symfony4 domain path"
    fi
}

function serve-pimcore() {
    if [[ "$1" && "$2" ]]
    then
        sudo bash /vagrant/scripts/create-certificate.sh "$1"
        sudo dos2unix /vagrant/scripts/site-types/pimcore.sh
        sudo bash /vagrant/scripts/site-types/pimcore.sh "$1" "$2" 80 443 "${3:-8.3}"
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  serve-pimcore domain path"
    fi
}

function share() {
    if [[ "$1" ]]
    then
        ngrok http ${@:2} $1:80 --host-header=rewrite
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  share domain"
        echo "Invocation with extra params passed directly to ngrok"
        echo "  share domain -region=eu -subdomain=test1234"
    fi
}

function sshare() {
    if [[ "$1" ]]
    then
        ngrok http ${@:2} $1:443 --host-header=rewrite
    else
        echo "Error: missing required parameters."
        echo "Usage: "
        echo "  sshare domain"
        echo "Invocation with extra params passed directly to ngrok"
        echo "  sshare domain --subdomain=test1234"
    fi
}

function flip() {
    sudo bash /vagrant/scripts/flip-webserver.sh
}

function __has_pv() {
    $(hash pv 2>/dev/null);

    return $?
}

function __pv_install_message() {
    if ! __has_pv; then
        echo $1
        echo "Install pv with \`sudo apt-get install -y pv\` then run this command again."
        echo ""
    fi
}

function dbexport() {
    FILE=${1:-/vagrant/mysqldump.sql.gz}

    # This gives an estimate of the size of the SQL file
    # It appears that 80% is a good approximation of
    # the ratio of estimated size to actual size
    SIZE_QUERY="select ceil(sum(data_length) * 0.8) as size from information_schema.TABLES"

    __pv_install_message "Want to see export progress?"

    echo "Exporting databases to '$FILE'"

    if __has_pv; then
        ADJUSTED_SIZE=$(mysql --vertical -uhomestead -psecret -e "$SIZE_QUERY" 2>/dev/null | grep 'size' | awk '{print $2}')
        HUMAN_READABLE_SIZE=$(numfmt --to=iec-i --suffix=B --format="%.3f" $ADJUSTED_SIZE)

        echo "Estimated uncompressed size: $HUMAN_READABLE_SIZE"
        mysqldump -uhomestead -psecret --all-databases --skip-lock-tables --routines 2>/dev/null | pv  --size=$ADJUSTED_SIZE | gzip > "$FILE"
    else
        mysqldump -uhomestead -psecret --all-databases --skip-lock-tables --routines 2>/dev/null | gzip > "$FILE"
    fi

    echo "Done."
}

function dbimport() {
    FILE=${1:-/vagrant/mysqldump.sql.gz}

    __pv_install_message "Want to see import progress?"

    echo "Importing databases from '$FILE'"

    if __has_pv; then
        pv "$FILE" --progress --eta | zcat | mysql -uhomestead -psecret 2>/dev/null
    else
        cat "$FILE" | zcat | mysql -uhomestead -psecret 2>/dev/null
    fi

    echo "Done."
}

function xphp() {
    (php -m | grep -q xdebug)
    if [[ $? -eq 0 ]]
    then
        XDEBUG_ENABLED=true
    else
        XDEBUG_ENABLED=false
    fi

    if ! $XDEBUG_ENABLED; then xon; fi

    HOST_IP=$(last --limit=1 | grep -oP '\d+(\.\d+){3}')

    php \
        -dxdebug.client_host=${HOST_IP} \
        -dxdebug.start_with_request=yes \
        "$@"

    if ! $XDEBUG_ENABLED; then xoff; fi
}