#!/bin/bash

CLI_VERSION="1.0.15"

BIN_DIR=$(dirname $0)

if [ -f $BIN_DIR/spry.php ]
then
   SPRY_DIR=$(dirname $BIN_DIR)
else
   SPRY_DIR=$(dirname $BIN_DIR)/ggedde/spry-cli
fi

SPRY_DIR_EXISTS=""

for arg in "$@"
do
    if [ "$arg" == "version" ] || [ "$arg" == "v" ] || [ "$arg" == "-v" ] || [ "$arg" == "--version" ] || [ "$arg" == "-h" ] || [ "$arg" == "--help" ]
    then
        echo "Spry-Cli -v $CLI_VERSION"
    fi

    if [ "$1" == "new" ] || [ "$1" == "n" ]
    then

        if [ $2 ] && [ "$2" != "" ]
        then
            
            if [ -d $2 ]
            then

                printf "\e[31;4mERROR:\e[0m directory '$2' already exists."
                echo ''
                exit

            fi

            mkdir $2

            if [ ! -d $2 ]
            then

                printf "\e[31;4mERROR:\e[0m Error creating directory '$2'."
                echo ''
                exit

            fi

            cd $2

            $BIN_DIR/spry init public

            exit

        else

            printf "\e[31;4mERROR:\e[0m Missing project name."
            echo ''
            exit

        fi

    fi

    if [ "$1" == "init" ] || [ "$1" == "i" ]
    then

        if [ -d 'spry' ]
        then
            SPRY_DIR_EXISTS="true"
            printf "The folder 'spry' already exists \e[91mignoring\e[0m."
            echo ''

            if [ ! $2 ] || [ "$2" == "" ]
            then

                exit

            fi

        else
            cp -r $SPRY_DIR/example_project spry

            if [ ! -f 'spry/config.php' ]
            then
                printf "\e[31;4mERROR:\e[0m Missing config file."
                echo ''
                exit
            fi

            dbchar=""
            dbcoll=""

            printf "\e[96mChoose a Database:\e[0m"
            echo ""
            COLUMNS=12
            PS3=$'\e[96mEnter your choice: \e[0m'
            options=("MySQL" "MariaDB" "PostgreSQL" "Sybase" "Oracle" "SQLite" "Microsoft SQL" "None")
            select opt in "${options[@]}"
            do
                case $opt in
                    "MySQL")
                        dbtype="mysql"
                        dbchar="utf8mb4"
                        dbcoll="utf8mb4_unicode_ci"
                        break
                        ;;
                    "MariaDB")
                        dbtype="mysql"
                        dbchar="utf8mb4"
                        dbcoll="utf8mb4_unicode_ci"
                        break
                        ;;
                    "PostgreSQL")
                        dbtype="pgsql"
                        break
                        ;;
                    "Sybase")
                        dbtype="sybase"
                        break
                        ;;
                    "Oracle")
                        dbtype="oracle"
                        break
                        ;;
                    "SQLite")
                        dbtype="sqlite"
                        break
                        ;;
                    "Microsoft SQL")
                        dbtype="mssql"
                        break
                        ;;
                    "None")
                        dbtype=""
                        break
                        ;;
                    *) echo "invalid option $REPLY";;
                esac
            done

            if [ $dbtype ]
            then
                printf "\e[96mDatabase\e[0m Type: $dbtype"
                echo ""
                printf "\e[96mDatabase\e[0m Name:"
                read -p ' ' dbname
                printf "\e[96mDatabase\e[0m Host:"
                read -p ' ' dbhost
                printf "\e[96mDatabase\e[0m Port:"
                read -p ' ' dbport
                printf "\e[96mDatabase\e[0m Prefix:"
                read -p ' ' dbpref
                printf  "\e[96mDatabase\e[0m Username:"
                read -p ' ' dbuser
                printf  "\e[96mDatabase\e[0m Password:"
                read -sp ' ' dbpass
                echo ""

                sed -i '' "s/\[dbtype\]/$dbtype/g" spry/config.php
                sed -i '' "s/\[dbname\]/$dbname/g" spry/config.php
                sed -i '' "s/\[dbhost\]/$dbhost/g" spry/config.php
                sed -i '' "s/\[dbport\]/$dbport/g" spry/config.php
                sed -i '' "s/\[dbpref\]/$dbpref/g" spry/config.php
                sed -i '' "s/\[dbuser\]/$dbuser/g" spry/config.php
                sed -i '' "s/\[dbpass\]/$dbpass/g" spry/config.php
                sed -i '' "s/\[dbchar\]/$dbchar/g" spry/config.php
                sed -i '' "s/\[dbcoll\]/$dbcoll/g" spry/config.php
                sed -i '' "s/\[dbprov\]/Spry\\\\\\SpryProvider\\\\\\SpryDB/g" spry/config.php

            else
                printf "\e[96mDatabase:\e[0m None"
                echo ""

                sed -i '' "s/\[dbtype\]//g" spry/config.php
                sed -i '' "s/\[dbname\]//g" spry/config.php
                sed -i '' "s/\[dbhost\]//g" spry/config.php
                sed -i '' "s/\[dbport\]//g" spry/config.php
                sed -i '' "s/\[dbuser\]//g" spry/config.php
                sed -i '' "s/\[dbpass\]//g" spry/config.php
                sed -i '' "s/\[dbpref\]//g" spry/config.php
                sed -i '' "s/\[dbchar\]//g" spry/config.php
                sed -i '' "s/\[dbcoll\]//g" spry/config.php
                sed -i '' "s/\[dbprov\]//g" spry/config.php
            fi

            printf "\e[96mEnable Logging:\e[0m"
            echo ""
            COLUMNS=12
            PS3=$'\e[96mEnter your choice: \e[0m'
            options=("Yes" "No")
            select opt in "${options[@]}"
            do
                case $opt in
                    "Yes")
                        echo "Spry::addHook('configure', 'Spry\\SpryProvider\\SpryLogger::initiate');" >> spry/config.php
                        break
                        ;;
                    "No")
                        echo "// Spry::addHook('configure', 'Spry\\SpryProvider\\SpryLogger::initiate');" >> spry/config.php
                        break
                        ;;
                    *) echo "invalid option $REPLY";;
                esac
            done

            printf "\e[96mEnable WebTools:\e[0m"
            echo ""
            COLUMNS=12
            PS3=$'\e[96mEnter your choice: \e[0m'
            options=("Yes" "No")
            select opt in "${options[@]}"
            do
                case $opt in
                    "Yes")
                        printf "\e[96mWebTools\e[0m Username:"
                        read -p ' ' wtuser
                        printf "\e[96mWebTools\e[0m Password:"
                        read -sp ' ' wtpass

                        sed -i '' "s/\[wtuser\]/$wtuser/g" spry/config.php
                        sed -i '' "s/\[wtpass\]/$wtpass/g" spry/config.php
                        
                        echo "Spry::addHook('setPath', 'Spry\\SpryProvider\\SpryWebTools::webTools');" >> spry/config.php

                        break
                        ;;
                    "No")
                        wtuser=""
                        wtpass=""
                        sed -i '' "s/\[wtuser\]/$wtuser/g" spry/config.php
                        sed -i '' "s/\[wtpass\]/$wtpass/g" spry/config.php

                        echo "// Spry::addHook('setPath', 'Spry\\SpryProvider\\SpryWebTools::webTools');" >> spry/config.php

                        break
                        ;;
                    *) echo "invalid option $REPLY";;
                esac
            done
        fi

        exit;

        if [ ! -f 'composer.json' ]
        then
            echo ""
            printf "\e[96mDownloading Composer Packages...\e[0m"
            echo ""
            composer require ggedde/spry
        fi

        if [ $2 ] && [ "$2" != "" ]
        then

            if [ "$SPRY_DIR_EXISTS" == "" ]
            then
                php $SPRY_DIR/src/SpryCli.php "$@"
            fi

            if [ -d $2 ]
            then
                printf "The folder '$2' already exists \e[91mignoring\e[0m."
                echo ''
            else
                mkdir $2
                echo "<?php

include dirname(__DIR__).'/vendor/autoload.php';
include dirname(__DIR__).'/spry/init.php';

" >> "$2/index.php";

                echo "Folder '$2' created."
                echo "File '$2/index.php' created."

            fi

            echo ''
            exit

        fi
    fi

    if [ "$1" == "up" ] || [ "$1" == "u" ]
    then

        PORT=8000

        if [ $2 ] && [ "$2" != "" ]
        then
            PORT=$2
        fi

        if [ $3 ] && [ "$3" != "" ] && [ -d $3 ]
        then
            echo ''
            php $SPRY_DIR/src/SpryCli.php "$@"
            php -S localhost:$PORT -t $3 &>/dev/null
            echo ''
            echo 'Spry Server Closed.'
            exit
        fi

        if [ ! $3 ] || [ $3 == "" ]
        then
            if [ -f "$PWD/vendor/autoload.php" ] && [ -f "$PWD/spry/init.php" ]
            then
                echo ''
                php $SPRY_DIR/src/SpryCli.php "$@"
                php -S localhost:$PORT $SPRY_DIR/server/up.php &>/dev/null
                echo ''
                echo 'Spry Server Closed.'
                exit
            else
                printf "\e[31;4mERROR:\e[0m Spry Server Could not find vendor/autoload.php or spry/init.php\nMake sure you run 'spry up' in your root Project directory that contains both vendor/autoload.php and spry/init.php\nOr run it with your endpoint folder 'spry up {public_dir}' that contains your index.php file."
                echo ''
                exit
            fi
        fi
    fi
done

php $SPRY_DIR/src/SpryCli.php "$@"
echo ''

exit
