#!/usr/bin/env bash

REPO="https://github.com/TeamUltroid/Ultroid.git"
CURRENT_DIR="$(pwd)"
ENV_FILE_PATH=".env"
DIR="/root/TeamUltroid"

while [ $# -gt 0 ]; do
    case "$1" in
    --dir=*)
        DIR="${1#*=}" || DIR="/root/TeamUltroid"
        ;;
    --branch=*)
        BRANCH="${1#*=}" || BRANCH="main"
        ;;
    --env-file=*)
        ENV_FILE_PATH="${1#*=}" || ENV_FILE_PATH=".env"
        ;;
    --no-root)
        NO_ROOT=true
        ;;
    *)
        echo "Unknown parameter passed: $1"
        exit 1
        ;;
    esac
    shift
done

check_dependencies() {
    # check if debian
    echo "Checking dependencies..."
    # read file with root access
    if ! [[ $(ls -l "/etc/sudoers" | cut -d " " -f1) =~ "r" ]]; then
        # check dependencies if installed
        echo -e "Root access not found. Checking if dependencies are installed." >&2
        if ! [ -x "$(command -v python3)" ] || ! [ -x "$(command -v python)" ]; then
            echo -e "Python3 isn't installed. Please install python3.10 or higher to run this bot." >&2
            exit 1
        fi
        if [ $(python3 -c "import sys; print(sys.version_info[1])") -lt 10 ] || [ $(python -c "import sys; print(sys.version_info[1])") -lt 10 ]; then
            echo -e "Python 3.10 or higher is required to run this bot." >&2
            exit 1
        fi
        # check if any of ffmpeg, mediainfo, neofetch, git is not installed
        if ! command -v ffmpeg &>/dev/null || ! command -v mediainfo &>/dev/null || ! command -v neofetch &>/dev/null || ! command -v git &>/dev/null; then
            echo -e "Some dependencies aren't installed. Please install ffmpeg, mediainfo, neofetch and git to run this bot." >&2
            exit 1
        fi
    fi
    if [ -x "$(command -v apt-get)" ]; then
        echo -e "Installing dependencies..."
        # check if any of ffmpeg, mediainfo, neofetch, git is not installed via dpkg
        if dpkg -l | grep -q ffmpeg || dpkg -l | grep -q mediainfo || dpkg -l | grep -q neofetch || dpkg -l | grep -q git; then
            sudo apt-get -qq -o=Dpkg::Use-Pty=0 update
            sudo apt-get install -qq -o=Dpkg::Use-Pty=0 python3 python3-pip ffmpeg mediainfo neofetch git -y
        fi
    elif [ -x "$(command -v pacman)" ]; then
        echo -e "Installing dependencies..."
        if pacman -Q | grep -q ffmpeg || pacman -Q | grep -q mediainfo || pacman -Q | grep -q neofetch || pacman -Q | grep -q git; then
            sudo pacman -Sy python python-pip git ffmpeg mediainfo neofetch --noconfirm
        fi
    else
        echo -e "Unknown OS. Checking if dependecies are installed" >&2
        if ! [ -x "$(command -v python3)" ] || ! [ -x "$(command -v python)" ]; then
            echo -e "Python3 isn't installed. Please install python3.10 or higher to run this bot." >&2
            exit 1
        fi
        if [ $(python3 -c "import sys; print(sys.version_info[1])") -lt 10 ] || [ $(python -c "import sys; print(sys.version_info[1])") -lt 10 ]; then
            echo -e "Python 3.10 or higher is required to run this bot." >&2
            exit 1
        fi
        if ! command -v ffmpeg &>/dev/null || ! command -v mediainfo &>/dev/null || ! command -v neofetch &>/dev/null || ! command -v git &>/dev/null; then
            echo -e "Some dependencies aren't installed. Please install ffmpeg, mediainfo, neofetch and git to run this bot." >&2
            exit 1
        fi
    fi
}

check_python() {
    # check if python is installed
    if ! command -v python3 &>/dev/null; then
        echo -e "Python3 isn't installed. Please install python3.10 or higher to run this bot."
        exit 1
    elif ! command -v python &>/dev/null; then
        echo -e "Python3 isn't installed. Please install python3.10 or higher to run this bot."
        exit 1
    fi
    if [ $(python3 -c "import sys; print(sys.version_info[1])") -lt 10 ]; then
        echo -e "Python 3.10 or higher is required to run this bot."
        exit 1
    elif [ $(python -c "import sys; print(sys.version_info[1])") -lt 3 ]; then
        if [ $(python -c "import sys; print(sys.version_info[1])") -lt 10 ]; then
            echo -e "Python 3.10 or higher is required to run this bot."
            exit 1
        fi
    fi
}

clone_repo() {
    # check if pyultroid, startup, plugins folders exist
    cd $DIR
    if [ -d $DIR ]; then
        if [ -d $DIR/.git ]; then
            echo -e "Updating Ultroid ${BRANCH}... "
            cd $DIR
            git pull
            currentbranch="$(git rev-parse --abbrev-ref HEAD)"
            if [ ! $BRANCH ]; then
                export BRANCH=$currentbranch
            fi
            case $currentbranch in
            $BRANCH)
                # do nothing
                ;;
            *)
                echo -e "Switching to branch ${BRANCH}... "
                echo -e $currentbranch
                git checkout $BRANCH
                ;;
            esac
        else
            rm -rf $DIR
            exit 1
        fi
        if [ -d "addons" ]; then
            cd addons
            git pull
        fi
        return
    else
        if [ ! $BRANCH ]; then
            export BRANCH="main"
        fi
        mkdir -p $DIR
        echo -e "Cloning Ultroid ${BRANCH}... "
        git clone -b $BRANCH $REPO $DIR
    fi
}

install_requirements() {
    pip3 install -q --upgrade pip
    echo -e "\n\nInstalling requirements... "
    pip3 install -q --no-cache-dir -r $DIR/requirements.txt
    pip3 install -q -r $DIR/resources/startup/optional-requirements.txt
}

railways_dep() {
    if [ $RAILWAY_STATIC_URL ]; then
        echo -e "Installing YouTube dependency... "
        pip3 install -q yt-dlp
    fi
}

misc_install() {
    if [ $SETUP_PLAYWRIGHT ]
    then
        echo -e "Installing playwright."
        pip3 install playwright
        playwright install
    fi
    if [ $OKTETO_TOKEN ]; then
        echo -e "Installing Okteto-CLI... "
        curl https://get.okteto.com -sSfL | sh
    elif [ $VCBOT ]; then
        if [ -d $DIR/vcbot ]; then
            cd $DIR/vcbot
            git pull
        else
            echo -e "Cloning VCBOT.."
            git clone https://github.com/TeamUltroid/VcBot $DIR/vcbot
        fi
        pip3 install pytgcalls==3.0.0.dev23 && pip3 install av -q --no-binary av
    fi
}

dep_install() {
    echo -e "\n\nInstalling DB Requirement..."
    if [ $MONGO_URI ]; then
        echo -e "   Installing MongoDB Requirements..."
        pip3 install -q pymongo[srv]
    elif [ $DATABASE_URL ]; then
        echo -e "   Installing PostgreSQL Requirements..."
        pip3 install -q psycopg2-binary
    elif [ $REDIS_URI ]; then
        echo -e "   Installing Redis Requirements..."
        pip3 install -q redis hiredis
    fi
}

main() {
    echo -e "Starting Ultroid Setup..."
    if [ -d "pyUltroid" ] && [ -d "resources" ] && [ -d "plugins" ]; then
        DIR=$CURRENT_DIR
    fi
    if [ -f $ENV_FILE_PATH ]
    then
        set -a
        source <(cat $ENV_FILE_PATH | sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")
        set +a
        cp $ENV_FILE_PATH .env
    fi
    (check_dependencies)
    (check_python)
    (clone_repo)
    (install_requirements)
    (railways_dep)
    (dep_install)
    (misc_install)
    echo -e "\n\nSetup Completed."
}

if [ $NO_ROOT ]; then
    echo -e "Running with non root"
    main
    return 0
elif [ -t 0 ]; then
    unameOut="$(uname -s)"
    case "${unameOut}" in
        Linux*)     machine=Linux;;
        Darwin*)    machine=Mac;;
        CYGWIN*)    machine=Cygwin;;
        MINGW*)     machine=MinGw;;
        *)          machine="UNKNOWN:${unameOut}"
    esac
    if machine != "Linux"; then
        echo -e "This script is only for Linux. Please use the Windows installer."
        exit 1
    fi
    # check if sudo is installed
    if ! command -v sudo &>/dev/null; then
        echo -e "Sudo isn't installed. Please install sudo to run this bot."
        exit 1
    fi
    sudo echo "Sudo permission granted."
    main
else
    echo "Not an interactive terminal, skipping sudo."
    # run main function
    main
fi
