#!/bin/bash

# App Commands Handler
# Handles all app subcommands by calling core functions

cliHandleAppCommands()
{
    local action="$initial_command2"
    local app_name="$initial_command3"
    local config="$initial_command4"
    local restore_arg2="$initial_command4"
    local restore_arg3="$initial_command5"
    local restore_arg4="$initial_command6"
    local tool_name="$initial_command4"
    local tool_args="$initial_command5"

    local reset_network="false"
    if [[ "$config" == "--reset-network" ]]; then
        reset_network="true"
        config=""
    elif [[ "$initial_command5" == "--reset-network" ]]; then
        reset_network="true"
    fi
    
    case "$action" in
        "list")
            if [[ -z "$app_name" ]]; then
                cliShowAppHelp
            elif [ "$app_name" = "available" ]; then
                appScanAvailable
            elif [ "$app_name" = "installed" ]; then
                databaseListInstalledApps
            else
                isNotice "Invalid list type: $app_name"
                cliShowAppHelp
            fi
            ;;
            
        "install")
            dockerInstallApp "$app_name" "$config" "$reset_network"
            ;;
            
        "uninstall")
            # Optional `--delete-images` flag (in any of the trailing
            # positions) tells the uninstall to also remove the app's
            # docker images. Default behaviour: keep them so a reinstall
            # is fast and offline-friendly.
            local _del_images="false"
            local _del_tasks="false"
            for _arg in "$config" "$initial_command5" "$initial_command6" "$initial_command7"; do
                [[ "$_arg" == "--delete-images" ]] && _del_images="true"
                [[ "$_arg" == "--delete-tasks"  ]] && _del_tasks="true"
            done
            dockerUninstallApp "$app_name" "$_del_images" "$_del_tasks"
            ;;
            
        "start")
            dockerStartApp "$app_name"
            ;;
            
        "stop")
            dockerStopApp "$app_name"
            ;;
            
        "restart")
            dockerRestartApp "$app_name"
            ;;
            
        "up")
            dockerComposeUp "$app_name"
            ;;
            
        "down")
            dockerComposeDown "$app_name"
            ;;
            
        "reload")
            dockerRestartAppViaInstall "$app_name"
            ;;
            
        "backup")
            if [[ -z "$app_name" ]]; then
                isNotice "No app provided."
                cliShowAppHelp
            else
                backupAppStart "$app_name"
            fi
            ;;

        "restore")
            if [[ -z "$app_name" ]]; then
                isNotice "No app provided."
                cliShowAppHelp
            else
                cliAppRestore "$app_name" "$restore_arg2" "$restore_arg3" "$restore_arg4"
            fi
            ;;
            
        "generate")
            if [[ -z "$app_name" ]]; then
                isNotice "No app provided."
                cliShowAppHelp
            else
                appGenerate "$app_name"
            fi
            ;;
            
        "status")
            if [[ -z "$app_name" ]]; then
                isNotice "No app provided."
                cliShowAppHelp
            else
                appStatus "$app_name"
            fi
            ;;

        "tool")
            # `libreportal app tool list [<app>]` — discover available tools.
            # When the second arg is the literal `list`, the third is treated
            # as an optional app filter. Otherwise the standard run shape
            # applies: `libreportal app tool <app> <tool_id> [args]`.
            if [[ "$app_name" == "list" ]]; then
                cliAppToolList "$tool_name"
            elif [[ -z "$app_name" || -z "$tool_name" ]]; then
                isNotice "Usage: libreportal app tool <app_name> <tool_name> [args]"
                isNotice "       libreportal app tool list [<app_name>]"
                cliShowAppHelp
            else
                dockerAppRunTool "$app_name" "$tool_name" "$tool_args"
            fi
            ;;
            
        *)
            isNotice "Invalid app command: $action"
            cliShowAppHelp
            ;;
    esac
}
