#!/bin/bash

# Category : Knowledge Management
# Description : Bookstack - Wiki/Knowledge Base (c/u/s/r/i):

installBookstack()
{
    local config_variables="$1"

    if [[ "$bookstack" == *[cCtTuUsSrRiI]* ]]; then
        dockerConfigSetupToContainer silent bookstack;
        local app_name=$CFG_BOOKSTACK_APP_NAME
		initializeAppVariables $app_name;
    fi

    if [[ "$bookstack" == *[cC]* ]]; then
        editAppConfig $app_name;
    fi

    if [[ "$bookstack" == *[uU]* ]]; then
        dockerUninstallApp $app_name;
    fi

    if [[ "$bookstack" == *[sS]* ]]; then
        dockerComposeDown $app_name;
    fi

    if [[ "$bookstack" == *[rR]* ]]; then
        dockerComposeRestart $app_name;
    fi

    if [[ "$bookstack" == *[iI]* ]]; then
        isHeader "Install $app_name"

		((menu_number++))
        echo ""
        echo "---- $menu_number. Setting up install folder and config file for $app_name."
        echo ""

        dockerConfigSetupToContainer "loud" "$app_name" "install" "$config_variables";
        isSuccessful "Install folders and Config files have been setup for $app_name."

        ((menu_number++))
        echo ""


		((menu_number++))
        echo ""
        echo "---- $menu_number. Setting up the $app_name docker-compose.yml file."
        echo ""

        dockerComposeSetupFile $app_name;

		((menu_number++))
        echo ""
        echo "---- $menu_number. Updating file permissions before starting."
        echo ""

		fixPermissionsBeforeStart $app_name;

		((menu_number++))
        echo ""
        echo "---- $menu_number. Running the docker-compose.yml to install and start $app_name"
        echo ""

		dockerComposeUpdateAndStartApp $app_name install;

        ((menu_number++))
        echo ""
        echo "---- $menu_number. Running Application specific updates (if required)"
        echo ""

        appUpdateSpecifics $app_name;

		((menu_number++))
        echo ""
        echo "---- $menu_number. Running Headscale setup (if required)"
        echo ""

		setupHeadscale $app_name;

		((menu_number++))
		echo ""
        echo "---- $menu_number. Adding $app_name to the Apps Database table."
        echo ""

		databaseInstallApp $app_name;

		((menu_number++))
		echo ""
		echo "---- $menu_number. Updating WebUI config file."
		echo ""

		webuiContainerSetup $app_name install;

		((menu_number++))
		echo ""
		echo "---- $menu_number. You can find $app_name files at $containers_dir$app_name"
        echo ""
        echo "    You can now navigate to your $app_name service using any of the options below : "
        echo ""

        menuShowFinalMessages $app_name;

        bookstack_target_email="${CFG_BOOKSTACK_ADMIN_EMAIL:-admin@admin.com}"
        bookstack_target_pass="${CFG_BOOKSTACK_ADMIN_PASSWORD:-password}"

        bookstack_compose_file="$containers_dir$app_name/docker-compose.yml"
        bookstack_port_pair=$(tagsManagerGetTagContent "$bookstack_compose_file" "PORTS_TAG_1")
        bookstack_host_port="${bookstack_port_pair%%:*}"
        bookstack_probe_url="http://127.0.0.1:${bookstack_host_port}/login"

        isNotice "Waiting for Bookstack to come online at ${bookstack_probe_url} ..."
        isNotice "This may take up to 20 seconds, please wait..."

        bookstack_attempts=0
        bookstack_ready=0
        while ((bookstack_attempts < 60)); do
            bookstack_http_code=$(curl -sS -o /dev/null --max-time 3 -w '%{http_code}' "$bookstack_probe_url" 2>/dev/null)
            if [[ "$bookstack_http_code" =~ ^(200|302)$ ]]; then
                bookstack_ready=1
                break
            fi
            sleep 2
            ((bookstack_attempts++))
        done

        if ((bookstack_ready == 0)); then
            isNotice "Bookstack did not respond on ${bookstack_probe_url} within $((60 * 2))s — admin account left at upstream defaults."
            echo ""
            isNotice "Bookstack admin login (default):"
            echo ""
            echo "      Email    : admin@admin.com"
            echo "      Password : password"
            echo ""
        else
            isSuccessful "Bookstack is online (HTTP ${bookstack_http_code})."

            bookstack_create_output=$(runFileOp docker exec \
                -e EZ_BS_NEW_EMAIL="$bookstack_target_email" \
                -e EZ_BS_NEW_PASS="$bookstack_target_pass" \
                bookstack sh -c 'cd /app/www && s6-setuidgid abc php artisan bookstack:create-admin --no-ansi --email="$EZ_BS_NEW_EMAIL" --name=Admin --password="$EZ_BS_NEW_PASS" 2>&1')
            bookstack_create_rc=$?
            if [[ $bookstack_create_rc -eq 0 ]]; then
                isSuccessful "Bookstack admin account created (email: $bookstack_target_email)."

                if [[ "$bookstack_target_email" != "admin@admin.com" ]]; then
                    runFileOp docker exec -i bookstack php /app/www/artisan tinker --no-ansi >/dev/null 2>&1 <<'PHP'
$c = class_exists('\BookStack\Users\Models\User') ? '\BookStack\Users\Models\User' : '\BookStack\Auth\User';
optional($c::where('email', 'admin@admin.com')->first())->delete();
PHP
                    isSuccessful "Removed seeded admin@admin.com account."
                fi

                echo ""
                isNotice "Bookstack admin login:"
                echo ""
                echo "      Email    : ${bookstack_target_email}"
                echo "      Password : ${bookstack_target_pass}"
                echo ""
            else
                isNotice "Bookstack admin auto-create failed (exit $bookstack_create_rc). Output:"
                echo "$bookstack_create_output" | sed 's/^/        /'
                echo ""
                isNotice "Falling back to upstream defaults — update from inside Bookstack."
                echo ""
                isNotice "Bookstack admin login (default):"
                echo ""
                echo "      Email    : admin@admin.com"
                echo "      Password : password"
                echo ""
            fi
        fi

		menu_number=0
        #sleep 3s
        cd
    fi
    bookstack=n
}
