#!/bin/bash
# CLOUD PRO - Estetik & Powerfull Edition
# Author: Cloud Pro Team
# Support: Ubuntu Debian CentOS Alma Rocky Alpine Arch

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
GRAY='\033[0;90m'
BOLD='\033[1m'
RESET='\033[0m'

BG_BLACK='\033[40m'
BG_BLUE='\033[44m'

CONFIG_DIR="/etc/cloud-pro"
CONFIG_FILE="$CONFIG_DIR/config"
SERVICE_FILE="/etc/systemd/system/cloud-pro.service"
BASE_DIR="/home/cloud-pro/CLOUD"

spinner() {
    local pid=$1
    local msg=$2
    local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
    local i=0
    tput civis
    while kill -0 $pid 2>/dev/null; do
        i=$(( (i+1) %10 ))
        printf "\r${CYAN}${spin:$i:1}${RESET} ${msg}..."
        sleep 0.1
    done
    printf "\r${GREEN}✔${RESET} ${msg}          \n"
    tput cnorm
}

banner() {
    clear
    echo -e "${CYAN}${BOLD}"
    cat << "EOF"
 ██████╗██╗      ██████╗ ██╗   ██╗██████╗     ██████╗ ██████╗  ██████╗ 
██╔════╝██║     ██╔═══██╗██║   ██║██╔══██╗    ██╔══██╗██╔══██╗██╔═══██╗
██║     ██║     ██║   ██║██║   ██║██║  ██║    ██████╔╝██████╔╝██║   ██║
██║     ██║     ██║   ██║██║   ██║██║  ██║    ██╔═══╝ ██╔══██╗██║   ██║
╚██████╗███████╗╚██████╔╝╚██████╔╝██████╔╝    ██║     ██║  ██║╚██████╔╝
 ╚═════╝╚══════╝ ╚═════╝  ╚═════╝ ╚═════╝     ╚═╝     ╚═╝  ╚═╝ ╚═════╝ 
EOF
    echo -e "${RESET}"
    echo -e "${PURPLE}  ESTETIK • POWERFULL • ALL OS VPS      ${YELLOW}PRO v3.0${RESET}"
    echo -e "${GRAY}────────────────────────────────────────────────────────${RESET}"
    IP=$(curl -s4 ifconfig.me || hostname -I | awk '{print $1}')
    STATUS=$(systemctl is-active cloud-pro 2>/dev/null | sed 's/active/🟢 ONLINE/;s/inactive/🔴 OFFLINE/;s/failed/💀 FAILED/')
    if [ -z "$STATUS" ]; then STATUS="🔴 OFFLINE"; fi
    echo -e "  ${WHITE}📡 IP:${RESET} ${GREEN}$IP${RESET}  ${WHITE}📁 Base:${RESET} ${CYAN}$BASE_DIR${RESET}  ${WHITE}⚡ Status:${RESET} $STATUS"
    echo -e "${GRAY}────────────────────────────────────────────────────────${RESET}"
    echo ""
}

detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
    else
        OS="unknown"
    fi
    echo $OS
}

install_deps() {
    OS=$(detect_os)
    echo -e "${YELLOW}⚙️  Deteksi OS: $OS${RESET}"
    case $OS in
        ubuntu|debian)
            apt update -qq &> /dev/null & spinner $! "Update package"
            apt install -y curl wget unzip rclone figlet > /dev/null 2>&1 & spinner $! "Install dependencies"
            ;;
        centos|almalinux|rocky|rhel|fedora)
            yum install -y curl wget unzip > /dev/null 2>&1 & spinner $! "Install dependencies"
            curl https://rclone.org/install.sh | bash > /dev/null 2>&1 & spinner $! "Install rclone"
            ;;
        alpine)
            apk add curl wget unzip rclone bash > /dev/null 2>&1 & spinner $! "Install dependencies"
            ;;
        arch)
            pacman -Sy --noconfirm curl wget unzip rclone > /dev/null 2>&1 & spinner $! "Install dependencies"
            ;;
    esac
}

setup_cloud() {
    banner
    echo -e "${BOLD}${WHITE}🚀 SETUP CLOUD PRO${RESET}\n"
    
    echo -ne "${CYAN}Username [Admin]: ${RESET}"; read USERNAME
    USERNAME=${USERNAME:-Admin}
    echo -ne "${YELLOW}Password [Anjay12!]: ${RESET}"; read -s PASSWORD
    echo ""
    PASSWORD=${PASSWORD:-Anjay12!}
    echo -ne "${GREEN}Port [80]: ${RESET}"; read PORT
    PORT=${PORT:-80}

    mkdir -p $BASE_DIR/{FOTO,VIDEO,DOKUMEN,AUDIO,BACKUP,LAINNYA}
    mkdir -p $CONFIG_DIR
    mkdir -p /etc/rclone

    cat > $CONFIG_FILE <<EOF
PORT='$PORT'
USERNAME='$USERNAME'
PASSWORD='$PASSWORD'
BASE_DIR='$BASE_DIR'
EOF

    cat > /etc/rclone/rclone.conf <<EOF
[cloud]
type = local
nounc = true
EOF

    cat > $SERVICE_FILE <<EOF
[Unit]
Description=CLOUD PRO - Estetik Powerfull
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/rclone serve webdav $BASE_DIR --addr 0.0.0.0:$PORT --config /etc/rclone/rclone.conf --user $USERNAME --pass $PASSWORD --vfs-cache-mode writes --dir-cache-time 1h --buffer-size 64M --transfers 16
Restart=always
RestartSec=3
User=root
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

    # Stop old service if exists
    systemctl stop levelup-cloud > /dev/null 2>&1
    systemctl disable levelup-cloud > /dev/null 2>&1

    systemctl daemon-reload
    systemctl enable cloud-pro > /dev/null 2>&1
    systemctl restart cloud-pro

    sleep 2
    echo ""
    echo -e "${BG_BLUE}${WHITE} 🎉 CLOUD PRO BERHASIL DIBUAT! ${RESET}"
    echo -e "${GREEN}────────────────────────────────────────${RESET}"
    echo -e "  ${WHITE}URL      :${RESET} ${CYAN}http://$IP:$PORT${RESET}"
    if [ "$PORT" == "80" ]; then
        echo -e "  ${WHITE}URL Easy :${RESET} ${CYAN}http://$IP${RESET}"
    fi
    echo -e "  ${WHITE}User     :${RESET} ${YELLOW}$USERNAME${RESET}"
    echo -e "  ${WHITE}Pass     :${RESET} ${YELLOW}$PASSWORD${RESET}"
    echo -e "  ${WHITE}Folder   :${RESET} $BASE_DIR"
    echo -e "${GREEN}────────────────────────────────────────${RESET}"
    echo ""
    ss -tlnp | grep $PORT
}

status_pro() {
    banner
    echo -e "${BOLD}${WHITE}📊 CLOUD PRO DASHBOARD${RESET}\n"
    
    IP=$(curl -s4 ifconfig.me || hostname -I | awk '{print $1}')
    source $CONFIG_FILE 2>/dev/null || PORT=80

    echo -e "${CYAN}┌─────────────────────────────────────────┐${RESET}"
    echo -e "${CYAN}│${RESET} ${WHITE}SERVICE${RESET}      $(systemctl is-active cloud-pro | sed 's/active/🟢 ONLINE/;s/inactive/🔴 OFFLINE/')                  ${CYAN}│${RESET}"
    echo -e "${CYAN}│${RESET} ${WHITE}PORT${RESET}         ${GREEN}$PORT${RESET}                         ${CYAN}│${RESET}"
    echo -e "${CYAN}│${RESET} ${WHITE}URL${RESET}          ${YELLOW}http://$IP:$PORT${RESET}     ${CYAN}│${RESET}"
    echo -e "${CYAN}│${RESET} ${WHITE}BASE${RESET}         $BASE_DIR      ${CYAN}│${RESET}"
    echo -e "${CYAN}└─────────────────────────────────────────┘${RESET}"
    echo ""
    echo -e "${WHITE}💾 Storage Usage:${RESET}"
    du -sh $BASE_DIR/* 2>/dev/null | awk '{printf "  %s %s\n", $2, $1}' | sed 's|.*CLOUD/||' | while read line; do echo -e "  ${PURPLE}▸${RESET} $line"; done
    echo ""
    echo -e "${WHITE}🔌 Listening Ports:${RESET}"
    ss -tlnp | grep rclone | awk '{print "  "$4" -> "$7}' | sed 's/users.*rclone/rclone/'
    echo ""
    echo -e "${WHITE}📜 Last 10 Logs:${RESET}"
    journalctl -u cloud-pro -n 10 --no-pager | tail -n 10 | sed 's/^/  /'
}

firewall_pro() {
    banner
    echo -e "${BOLD}${WHITE}🔥 CLOUD PRO FIREWALL${RESET}\n"
    source $CONFIG_FILE 2>/dev/null || PORT=80
    echo -e "Membuka port ${GREEN}$PORT, 80, 443, 8443, 8880${RESET}..."
    
    if command -v ufw &> /dev/null; then
        ufw allow $PORT/tcp > /dev/null 2>&1
        ufw allow 80/tcp > /dev/null 2>&1
        ufw allow 443/tcp > /dev/null 2>&1
        echo -e "${GREEN}✔ UFW opened${RESET}"
    fi
    if command -v firewall-cmd &> /dev/null; then
        firewall-cmd --add-port=$PORT/tcp --permanent > /dev/null 2>&1
        firewall-cmd --reload > /dev/null 2>&1
        echo -e "${GREEN}✔ FirewallD opened${RESET}"
    fi
    iptables -I INPUT -p tcp --dport $PORT -j ACCEPT 2>/dev/null
    iptables -I INPUT -p tcp --dport 80 -j ACCEPT 2>/dev/null
    iptables -I INPUT -p tcp --dport 443 -j ACCEPT 2>/dev/null
    echo -e "${GREEN}✔ IPTables opened${RESET}"
    echo -e "\n${GREEN}Firewall beres cuk!${RESET}"
}

ssl_pro() {
    banner
    echo -e "${BOLD}${WHITE}🔒 CLOUD PRO SSL / HTTPS${RESET}\n"
    echo -ne "${CYAN}Masukkan Domain kamu ex: cloud.kamu.com: ${RESET}"; read DOMAIN
    if [ -z "$DOMAIN" ]; then echo -e "${RED}Domain kosong!${RESET}"; return; fi
    
    echo -e "${YELLOW}Install Caddy...${RESET}"
    apt install -y debian-keyring debian-archive-keyring apt-transport-https > /dev/null 2>&1
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg > /dev/null 2>&1
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list > /dev/null
    apt update -qq && apt install -y caddy > /dev/null 2>&1 & spinner $! "Install Caddy"
    
    source $CONFIG_FILE
    cat > /etc/caddy/Caddyfile <<EOF
$DOMAIN {
    reverse_proxy localhost:$PORT {
        header_up Authorization {http.request.header.Authorization}
    }
    basicauth {
        $USERNAME $(caddy hash-password --plaintext $PASSWORD)
    }
}
EOF
    systemctl restart caddy
    echo -e "${GREEN}✔ SSL Aktif! Buka https://$DOMAIN${RESET}"
}

menu() {
    banner
    echo -e "${WHITE}${BOLD}  MENU CLOUD PRO:${RESET}\n"
    echo -e "  ${CYAN}1.${RESET} ${WHITE}🚀 Install / Re-Install${RESET}            ${GRAY}- Setup baru super cepat${RESET}"
    echo -e "  ${CYAN}2.${RESET} ${WHITE}📊 Status Dashboard${RESET}                ${GRAY}- Cek IP, storage, logs${RESET}"
    echo -e "  ${CYAN}3.${RESET} ${WHITE}🔑 Ganti User & Port${RESET}               ${GRAY}- Ganti login & port${RESET}"
    echo -e "  ${CYAN}4.${RESET} ${WHITE}🔥 Buka Firewall All Port${RESET}          ${GRAY}- Auto open 80,443,8443${RESET}"
    echo -e "  ${CYAN}5.${RESET} ${WHITE}🔒 Pasang SSL + Domain (HTTPS)${RESET}     ${GRAY}- Jadi https:// auto${RESET}"
    echo -e "  ${CYAN}6.${RESET} ${WHITE}📜 Live Logs${RESET}                        ${GRAY}- Monitor real-time${RESET}"
    echo -e "  ${CYAN}7.${RESET} ${WHITE}💾 Backup Config${RESET}                   ${GRAY}- Backup ke tar.gz${RESET}"
    echo -e "  ${CYAN}8.${RESET} ${WHITE}🧹 Uninstall${RESET}                        ${GRAY}- Hapus total${RESET}"
    echo -e "  ${RED}0. Keluar${RESET}\n"
    echo -e "${GRAY}────────────────────────────────────────────────────────${RESET}"
    echo -ne "${YELLOW} Pilih [0-8]: ${RESET}"; read PILIH
    case $PILIH in
        1) install_deps; setup_cloud; read -p "ENTER untuk kembali..." ;;
        2) status_pro; read -p "ENTER untuk kembali..." ;;
        3) setup_cloud; read -p "ENTER untuk kembali..." ;;
        4) firewall_pro; read -p "ENTER untuk kembali..." ;;
        5) ssl_pro; read -p "ENTER untuk kembali..." ;;
        6) journalctl -u cloud-pro -f ;;
        7) tar -czf ~/cloud-pro-backup-$(date +%F).tar.gz /etc/cloud-pro /home/cloud-pro; echo -e "${GREEN}Backup di ~/cloud-pro-backup-$(date +%F).tar.gz${RESET}"; read -p "ENTER..." ;;
        8) systemctl stop cloud-pro; rm -rf /etc/cloud-pro $SERVICE_FILE $BASE_DIR /etc/systemd/system/levelup-cloud.service; systemctl daemon-reload; echo -e "${RED}Cloud Pro dihapus!${RESET}"; read -p "ENTER..." ;;
        0) exit 0 ;;
        *) echo -e "${RED}Salah pilih cuk!${RESET}"; sleep 1 ;;
    esac
    menu
}

# Start
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}Harus root cuk! sudo bash $0${RESET}"
    exit 1
fi
menu
 
