#!/bin/bash
# ======================================================
#  HOKAGE LEGEND ACCOUNT MANAGER (LOOP & COLOR FIX)
# ======================================================

# --- INSTALL DEPENDENCY ---
if ! command -v jq &> /dev/null; then
    apt-get install jq -y > /dev/null 2>&1
fi

# --- DEFINISI WARNA (FIXED) ---
# Menggunakan \033 agar kompatibel penuh
y='\033[1;33m'       # Yellow
z='\033[96m'         # Cyan (Border)
RED='\033[1;31m'     # Red
NC='\033[0m'         # No Color
green='\033[1;32m'   # Green
purple="\033[1;95m"
BOLD='\033[1m'
WHITE='\033[1;37m'

# --- CONFIG ---
ZIVPN_CONFIG="/etc/zivpn/config.json"
ZIVPN_DB="/etc/zivpn/user-db.json"
SERVICE_NAME="zivpn.service"

# ==================================================
# FUNGSI GRADASI
# ==================================================
print_gradient() {
    local text="$1"
    awk -v text="$text" 'BEGIN {
        len = length(text);
        r_start=255; g_start=215; b_start=0;
        r_mid=0;     g_mid=128;   b_mid=255;
        r_end=138;   g_end=43;    b_end=226;
        for (i=0; i<len; i++) {
            ratio = i / (len-1);
            if (ratio <= 0.5) {
                f = ratio * 2;
                r = int(r_start + (r_mid - r_start) * f);
                g = int(g_start + (g_mid - g_start) * f);
                b = int(b_start + (b_mid - b_start) * f);
            } else {
                f = (ratio - 0.5) * 2;
                r = int(r_mid + (r_end - r_mid) * f);
                g = int(g_mid + (g_end - g_mid) * f);
                b = int(b_mid + (b_end - b_mid) * f);
            }
            printf "\033[38;2;%d;%d;%dm%s", r, g, b, substr(text, i+1, 1);
        }
        printf "\033[0m\n";
    }'
}

# ==================================================
# MAIN LOOP (Agar tidak langsung keluar)
# ==================================================
while true; do
    # Reset Array setiap kali loop
    unset USER_LIST
    declare -a USER_LIST
    
    clear
    echo -e " "
    print_gradient "╭══════════════════════════════════════════════════════════╮"
    print_gradient "│        DELETE SSH & ZIVPN ACCOUNT (PREMIUM STYLE)        │"
    print_gradient "╰══════════════════════════════════════════════════════════╯"

    # Table Header
    echo -e " ${z}╭────┬──────────────────┬──────────────┬──────────────┬────╮${NC}"
    echo -e " ${z}│${NC} ${BOLD}NO${NC} ${z}│${NC} ${BOLD}USERNAME${NC}         ${z}│${NC} ${BOLD}EXP DATE${NC}     ${z}│${NC} ${BOLD}COUNTDOWN${NC}    ${z}│${NC} ${BOLD}ST${NC} ${z}│${NC}"
    echo -e " ${z}╞════╪══════════════════╪══════════════╪══════════════╪════╡${NC}"

    total_user=0
    total_active=0
    total_expired=0
    num=0

    # Loop membaca /etc/passwd
    while IFS=: read -r user pass uid gid info home shell; do
        if [[ "$uid" -ge 1000 && "$user" != "nobody" ]]; then
            ((num++))
            ((total_user++))
            
            # Simpan ke Array
            USER_LIST[$num]=$user
            
            # 1. Ambil Data Expired
            exp_str=$(chage -l "$user" | grep "Account expires" | cut -d: -f2 | sed 's/^ //g')
            display_exp="${exp_str:0:12}"
            
            # 2. Cek Status Password
            status_raw=$(passwd -S "$user" | awk '{print $2}')
            
            # 3. Logic Warna ICON (Hanya Icon yang berwarna)
            # Default Text Color untuk Countdown adalah Cyan/White
            TXT_COLOR=$z 
            
            if [[ "$exp_str" == "never" || -z "$exp_str" ]]; then
                TXT_COUNT="Forever"
                ICON="♾️"
                ICON_COLOR=$green
                ((total_active++))
            else
                today_sec=$(date +%s)
                exp_sec=$(date -d "$exp_str" +%s 2>/dev/null)
                
                if [ $? -eq 0 ]; then
                    diff_sec=$((exp_sec - today_sec))
                    diff_days=$((diff_sec / 86400))
                    
                    if [[ "$status_raw" == "L" ]]; then
                        # LOCKED
                        TXT_COUNT="${diff_days} Days"
                        ICON="🔒"
                        ICON_COLOR=$RED
                    elif [[ "$diff_days" -lt 0 ]]; then
                        # EXPIRED -> Icon Merah
                        TXT_COUNT="Overdue"
                        ICON="●"
                        ICON_COLOR=$RED
                        ((total_expired++))
                    elif [[ "$diff_days" -le 2 ]]; then
                        # WARNING -> Icon Kuning
                        TXT_COUNT="${diff_days} Days"
                        ICON="●"
                        ICON_COLOR=$y
                        ((total_active++))
                    else
                        # ACTIVE -> Icon Hijau
                        TXT_COUNT="${diff_days} Days"
                        ICON="●"
                        ICON_COLOR=$green
                        ((total_active++))
                    fi
                else
                    TXT_COUNT="Error"
                    ICON="❓"
                    ICON_COLOR=$RED
                fi
            fi

            # 4. PRINT BARIS TABEL (FIXED)
            # Perhatikan: ${ICON_COLOR} hanya membungkus variabel $ICON
            printf " ${z}│${NC} %-2s ${z}│${NC} %-16s ${z}│${NC} %-12s ${z}│${NC} ${z}%-12s${NC} ${z}│${NC} ${ICON_COLOR}%-2s${NC} ${z}│${NC}\n" \
            "$num" "$user" "$display_exp" "$TXT_COUNT" "$ICON"
        fi
    done < /etc/passwd

    echo -e " ${z}╰────┴──────────────────┴──────────────┴──────────────┴────╯${NC}"

    # Footer Stats
    echo -e ""
    echo -e "  ${BOLD}Total:${NC} $total_user    ${green}Active:${NC} $total_active    ${RED}Expired:${NC} $total_expired"
    echo -e ""

    # ==================================================
    # SELECTION PROCESS
    # ==================================================
    print_gradient "════════════════════════════════════════════════════════════"
    echo -e " ${BOLD}DELETE ACTION${NC}"
    print_gradient "════════════════════════════════════════════════════════════"
    echo -e " Type ${RED}x${NC} or ${RED}menu${NC} to return to Main Menu"
    read -p " Select Number (1-$num) or Username : " selection

    # 1. Cek jika user ingin keluar/ke menu
    if [[ "$selection" == "x" || "$selection" == "menu" ]]; then
        clear
        menu
        break
    fi

    # 2. Validasi Input Kosong
    if [[ -z "$selection" ]]; then
        echo -e " ${RED}[!] Action Cancelled.${NC}"
        sleep 1
        continue
    fi

    # 3. Logic: Angka atau Username?
    if [[ "$selection" =~ ^[0-9]+$ ]]; then
        if [ "$selection" -gt "$num" ] || [ "$selection" -lt 1 ]; then
            echo -e " ${RED}❌ Error: Number out of range!${NC}"
            sleep 1
            continue
        fi
        Pengguna=${USER_LIST[$selection]}
    else
        Pengguna=$selection
    fi

    # ==================================================
    # EXECUTION
    # ==================================================
    if getent passwd "$Pengguna" > /dev/null 2>&1; then
        echo -e ""
        echo -e " ${z}[PROCESS]${NC} Deleting User: ${y}$Pengguna${NC}..."
        
        # 1. System Delete
        userdel -f "$Pengguna" > /dev/null 2>&1
        
        # 2. ZiVPN Delete
        if [ -f "$ZIVPN_CONFIG" ]; then
            if jq -e ".auth.config | index(\"$Pengguna\")" "$ZIVPN_CONFIG" > /dev/null; then
                jq --arg u "$Pengguna" '.auth.config -= [$u]' "$ZIVPN_CONFIG" > "${ZIVPN_CONFIG}.tmp" && mv "${ZIVPN_CONFIG}.tmp" "$ZIVPN_CONFIG"
                jq --arg u "$Pengguna" 'del(.[$u])' "$ZIVPN_DB" > "${ZIVPN_DB}.tmp" && mv "${ZIVPN_DB}.tmp" "$ZIVPN_DB"
                systemctl restart "$SERVICE_NAME" > /dev/null 2>&1
                echo -e " ${green}[  OK  ]${NC} Removed from ZiVPN Database"
            fi
        fi

        # 3. Cronjob Trial Clean
        if [ -f "/etc/cron.d/trialssh-$Pengguna" ]; then
            rm -f "/etc/cron.d/trialssh-$Pengguna"
            service cron reload > /dev/null 2>&1
            echo -e " ${green}[  OK  ]${NC} Trial Auto-Kill Stopped"
        fi

        # 4. Cleanup Files
        sed -i "/^#ssh# ${Pengguna} /d" /etc/ssh/.ssh.db > /dev/null 2>&1
        rm -f "/var/www/html/ssh-$Pengguna.txt" > /dev/null 2>&1
        rm -f "/etc/kyt/limit/ssh/ip/$Pengguna" > /dev/null 2>&1

        echo -e ""
        echo -e " ${green}✅ SUCCESS:${NC} Account ${y}$Pengguna${NC} deleted."
        echo -e " List will refresh in 2 seconds..."
        sleep 2
    else
        echo -e ""
        echo -e " ${RED}❌ ERROR:${NC} User ${y}$Pengguna${NC} Not Found."
        sleep 2
    fi
    # Loop akan mengulang dari atas, menampilkan list user yang tersisa
done