#!/bin/bash
# -----------------------------------------------------------------------
# Dynasty Module: Proxmox Commander (v2.0.1 - Ironclad Edition)
# -----------------------------------------------------------------------
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
HOST_FILE="$HOME/.dynr/.pve_hosts"; mkdir -p "$HOME/.dynr"
IS_MAC=false; [[ "$OSTYPE" == "darwin"* ]] && IS_MAC=true

# --- 0. SMART DEPENDENCY BOOTSTRAPPER ---
check_sshpass() {
    if ! command -v sshpass &> /dev/null && [ "$IS_MAC" = true ]; then
        clear
        echo -e "${RED}⚠️  Dependency Missing: 'sshpass' is required for password-based login.${NC}"
        echo -e "How would you like to proceed?"
        echo -e "1) ${GOLD}Switch to SSH Keys${NC} (Recommended - Bypass passwords)"
        echo -e "2) ${BLUE}Install Homebrew & sshpass${NC} (Standard Apple/Linux flow)"
        echo -e "3) ${PURPLE}Compile from Source${NC} (Requires Xcode)"
        echo -e "4) ${RED}Quit Entirely${NC} (Return to Dynasty Gate)"
        read -p "Selection [1-4]: " D_CHOICE < /dev/tty

        case $D_CHOICE in
            1) echo -e "${GOLD}Initiating Key Exchange...${NC}"
               [[ ! -f "$HOME/.ssh/id_rsa.pub" ]] && ssh-keygen -t rsa -b 4096 -f "$HOME/.ssh/id_rsa" -N ""
               echo -e "Run this next: ${BLUE}ssh-copy-id root@YOUR_IP${NC}"
               read -p "Press Enter to return to menu..." ; return 1 ;;
            2) if ! command -v brew &> /dev/null; then
                   echo -e "${BLUE}Homebrew not found. Installing...${NC}"
                   /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
               fi
               echo -e "${BLUE}Installing sshpass...${NC}"; brew install sshpass ;;
            3) echo -e "${PURPLE}Starting Source Compilation...${NC}"
               if ! command -v cc &> /dev/null; then
                   echo -e "${RED}Xcode Command Line Tools missing.${NC}"; xcode-select --install
                   echo "Finish the Apple installer and relaunch."; exit 1
               fi
               curl -L https://sourceforge.net/projects/sshpass/files/latest/download -o sshpass.tar.gz
               tar -xvf sshpass.tar.gz && cd sshpass-*
               ./configure && make && sudo make install
               cd .. && rm -rf sshpass* ;;
            *) echo -e "${RED}Aborting...${NC}"; sleep 1; exit 0 ;;
        esac
    fi
}

# --- 1. HOST SELECTION ---
if ! command -v pct &> /dev/null; then
    if [ -f "$HOST_FILE" ]; then
        [ "$IS_MAC" = true ] && sed -i '' '/^$/d' "$HOST_FILE" || sed -i '/^$/d' "$HOST_FILE"
    fi

    if [[ ! -s "$HOST_FILE" ]]; then 
        echo -e "${RED}No Proxmox hosts found.${NC}"
        read -p "Add new host now? (y/n/q=quit): " ADD_NOW < /dev/tty
        [[ "$ADD_NOW" == "q" ]] && exit 0
        [[ "$ADD_NOW" =~ ^[Yy]$ ]] && HP="n" || exit 0
    else
        echo -e "${PURPLE}🐉 Your Proxmox VE Hosts:${NC}"
        i=1; while IFS='|' read -r ip usr am pe nick; do
            echo -e "     $i) $usr@$ip ($nick)"; ((i++))
        done < "$HOST_FILE"
        read -p "Selection (ID#, n=new, m=manage, q=quit): " HP < /dev/tty
    fi
    
    [[ "$HP" == "q" ]] && exit 0

    if [[ "$HP" == "n" ]]; then
        read -p "IP: " IP; read -p "User (root): " USR; USR=${USR:-root}
        echo -e "1) Key  2) Pass  3) Back"
        read -p ": " AT
        [[ "$AT" == "3" ]] && exec "$0"
        if [[ "$AT" == "1" ]]; then
            [[ ! -f "$HOME/.ssh/id_rsa.pub" ]] && ssh-keygen -t rsa -b 4096 -f "$HOME/.ssh/id_rsa" -N ""
            ssh-copy-id "$USR@$IP" && { AM="KEY"; PE="NONE"; }
        else
            check_sshpass || exec "$0"
            read -rs -p "Pass: " P; echo ""; AM="PASS"; PE=$(echo -n "$P" | base64); fi
        read -p "Nickname: " HN; echo "$IP|$USR|$AM|$PE|$HN" >> "$HOST_FILE"; exec "$0"
    elif [[ "$HP" =~ ^[0-9]+$ ]]; then
        LINE=$(sed -n "${HP}p" "$HOST_FILE")
        IP=$(echo "$LINE" | cut -d'|' -f1); USR=$(echo "$LINE" | cut -d'|' -f2); AM=$(echo "$LINE" | cut -d'|' -f3); PE=$(echo "$LINE" | cut -d'|' -f4)
        if [[ "$AM" == "PASS" ]]; then 
            check_sshpass || exec "$0"
            P_DEC=$(echo "$PE" | base64 --decode)
            REMOTE_BASE="sshpass -p '$P_DEC' ssh -o StrictHostKeyChecking=no -t $USR@$IP"
        else 
            REMOTE_BASE="ssh -o StrictHostKeyChecking=no -t $USR@$IP"; fi
    else
        exec "$0"; fi
else
    REMOTE_BASE=""; IP="LocalHost"; fi

# --- 2. FLEET OPS MENU ---
while true; do
    clear; echo -e "${BLUE}🐉 Proxmox Commander | $IP${NC}"
    echo -e "1) ${GOLD}Create LXC(s)${NC}\n2) ${BLUE}Dashboard${NC}\n3) ${PURPLE}Console (Shell)${NC}\n4) Selective Update\n5) Switch Host\n6) Exit"
    read -p "Select: " OPT < /dev/tty
    case $OPT in
        1) # Creation logic
           read -p "🚢 Count (q=back): " CT; [[ "$CT" == "q" ]] && continue
           read -p "🔢 Start ID: " SID; read -p "📏 Disk (GB): " DSZ
           $REMOTE_BASE "pvesm status"; read -p "📥 Template Store: " TS; read -p "💾 Disk Store: " DS
           for (( i=0; i<CT; i++ )); do
               CID=$((SID + i)); read -p "🏷️ Name for $CID: " NM
               echo -e "💿 Distro: 1) Deb 12 2) Deb 13 3) Alpine 4) Arch"; read -p ": " DP
               case $DP in 1) T="debian-12-standard_12.2-1_amd64.tar.zst" ;; 2) T="debian-13-standard_13.0-1_amd64.tar.zst" ;; 3) T="alpine-3.19-default_20240207_amd64.tar.xz" ;; 4) T="archlinux-base_20230608-1_amd64.tar.zst" ;; esac
               $REMOTE_BASE "pct create $CID $TS:vztmpl/$T --hostname $NM --storage $DS --rootfs $DS:$DSZ --net0 name=eth0,bridge=vmbr0,ip=dhcp"
               $REMOTE_BASE "pct start $CID"; done; read -p "Done..." < /dev/tty ;;
        2) $REMOTE_BASE "pct list"; read -p "Enter..." < /dev/tty ;;
        3) echo -e "1) Host Shell  2) LXC Console  3) Back"
           read -p ": " CG < /dev/tty
           case $CG in
               1) eval "$REMOTE_BASE" ;;
               2) read -p "LXC ID: " LID < /dev/tty; eval "$REMOTE_BASE \"pct enter $LID\"" ;;
               *) continue ;;
           esac 
           read -p "Returned. Press Enter..." < /dev/tty ;;
        4) echo -e "1) ${GOLD}Update Host ($IP)${NC}\n2) ${BLUE}Update ALL LXCs${NC}\n3) Back"
           read -p "Choice: " UO < /dev/tty
           if [[ "$UO" == "1" ]]; then $REMOTE_BASE "apt update && apt upgrade -y"
           elif [[ "$UO" == "2" ]]; then $REMOTE_BASE "for id in \$(pct list | awk 'NR>1 {print \$1}'); do echo \"Updating \$id...\"; pct exec \$id -- apt update && pct exec \$id -- apt upgrade -y; done"; fi
           read -p "Done..." < /dev/tty ;;
        5) exec "$0" ;;
        6) exit 0 ;;
    esac
done