#!/usr/bin/env bash
# ====================================================================
# FRP Client Automated Installer for Ubuntu / Linux
# ====================================================================

# Color Codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# Check Root Privileges
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[ERROR] กรุณารันสคริปต์นี้ด้วยสิทธิ์ root (เช่น sudo ./install.sh)${NC}"
    exit 1
fi

echo -e "${CYAN}====================================================================${NC}"
echo -e "${GREEN}        🚀 FRP Client Automated Setup & Systemd Installer 🚀        ${NC}"
echo -e "${CYAN}====================================================================${NC}"

# Ensure required commands exist (curl or wget)
if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    echo -e "${YELLOW}[INFO] ไม่พบ curl หรือ wget ในระบบ กำลังติดตั้ง curl...${NC}"
    if command -v apt-get &> /dev/null; then
        apt-get update -qq && apt-get install -y -qq curl
    elif command -v yum &> /dev/null; then
        yum install -y -q curl
    elif command -v dnf &> /dev/null; then
        dnf install -y -q curl
    elif command -v apk &> /dev/null; then
        apk add --no-cache curl
    fi
fi

# Helper Download Function (Supports both curl and wget)
download_file() {
    local url="$1"
    local dest="$2"
    if command -v curl &> /dev/null; then
        curl -sSL -f "$url" -o "$dest" 2>/dev/null
    elif command -v wget &> /dev/null; then
        wget -qO "$dest" "$url" 2>/dev/null
    else
        return 1
    fi
}

REPO_URL="https://wld.ddshop-th.com"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"
INSTALL_BIN="/usr/local/bin/frpc"
CONFIG_DIR="/etc/frp"
CONFIG_FILE="$CONFIG_DIR/frpc.toml"
SERVICE_FILE="/etc/systemd/system/frpc.service"

mkdir -p "$CONFIG_DIR"

# Parse optional command-line arguments for unattended / quick install
AUTO_INSTALL=false
while [[ $# -gt 0 ]]; do
    case "$1" in
        -y|--auto|--silent)
            AUTO_INSTALL=true
            shift
            ;;
        -c|--choice|--config-method)
            CONFIG_CHOICE="$2"
            AUTO_INSTALL=true
            shift 2
            ;;
        -m|--manager|--url)
            MANAGER_URL="$2"
            CONFIG_CHOICE="1"
            AUTO_INSTALL=true
            shift 2
            ;;
        *)
            shift
            ;;
    esac
done

# Step 1: Binary Check & Installation
echo -e "\n${BLUE}[1/4] ตรวจสอบและติดตั้งไฟล์ไบนารี frpc...${NC}"
if [ -f "$SCRIPT_DIR/bin/frpc" ]; then
    cp "$SCRIPT_DIR/bin/frpc" "$INSTALL_BIN"
    chmod +x "$INSTALL_BIN"
    echo -e "${GREEN}✔ ติดตั้งไฟล์ frpc จากโฟลเดอร์ไว้ที่ $INSTALL_BIN เรียบร้อยแล้ว${NC}"
else
    echo -e "${YELLOW}[INFO] ไม่พบไบนารีในเครื่อง กำลังดาวน์โหลดจาก $REPO_URL ...${NC}"
    rm -f "$INSTALL_BIN.tmp"
    
    # ลำดับการตรวจสอบดาวน์โหลด: 1. bin/frpc  2. frpc (root)  3. API /api/download-frpc
    if download_file "$REPO_URL/bin/frpc" "$INSTALL_BIN.tmp" && [ -s "$INSTALL_BIN.tmp" ]; then
        mv "$INSTALL_BIN.tmp" "$INSTALL_BIN"
    elif download_file "$REPO_URL/frpc" "$INSTALL_BIN.tmp" && [ -s "$INSTALL_BIN.tmp" ]; then
        mv "$INSTALL_BIN.tmp" "$INSTALL_BIN"
    elif download_file "$REPO_URL/api/download-frpc" "$INSTALL_BIN.tmp" && [ -s "$INSTALL_BIN.tmp" ]; then
        mv "$INSTALL_BIN.tmp" "$INSTALL_BIN"
    else
        rm -f "$INSTALL_BIN.tmp"
        echo -e "${RED}[ERROR] ไม่สามารถดาวน์โหลด frpc จาก $REPO_URL ได้ กรุณาตรวจสอบลิงก์หรือไฟล์ไบนารีบนเซิร์ฟเวอร์${NC}"
        exit 1
    fi
    
    chmod +x "$INSTALL_BIN"
    echo -e "${GREEN}✔ ดาวน์โหลดและติดตั้งไบนารีที่ $INSTALL_BIN เรียบร้อยแล้ว${NC}"
fi

# Step 2: Configuration Selection
echo -e "\n${BLUE}[2/4] เลือกวิธีการตั้งค่าคอนฟิก (Configuration Method):${NC}"
echo -e "  ${GREEN}1)${NC} ดึงค่าคอนฟิกอัตโนมัติจากเซิร์ฟเวอร์/API ($REPO_URL)"
echo -e "  ${GREEN}2)${NC} กำหนดค่าด้วยตนเอง (Manual Input: Server IP / Token / Proxy)"
echo -e "  ${GREEN}3)${NC} ดาวน์โหลดไฟล์คอนฟิกมาตรฐานจาก $REPO_URL/config/frpc.toml"

if [ "$AUTO_INSTALL" = false ]; then
    read -p "เลือกตัวเลือก [1-3] (ค่าเริ่มต้น: 1): " CONFIG_CHOICE < /dev/tty 2>/dev/null
fi
CONFIG_CHOICE=${CONFIG_CHOICE:-1}

if [ "$CONFIG_CHOICE" = "1" ]; then
    echo -e "\n${CYAN}--- ดึงคอนฟิกจากเซิร์ฟเวอร์ ---${NC}"
    if [ "$AUTO_INSTALL" = false ]; then
        read -p "ระบุ URL หรือ IP ของ FRP Manager (ค่าเริ่มต้น: $REPO_URL): " MANAGER_URL < /dev/tty 2>/dev/null
    fi
    MANAGER_URL=${MANAGER_URL:-$REPO_URL}
    MANAGER_URL=${MANAGER_URL%/} # remove trailing slash
    
    echo -e "${YELLOW}[INFO] กำลังดาวน์โหลดคอนฟิกจาก $MANAGER_URL ...${NC}"
    rm -f "$CONFIG_FILE.tmp"
    
    if download_file "$MANAGER_URL/api/download-client-config" "$CONFIG_FILE.tmp" && [ -s "$CONFIG_FILE.tmp" ]; then
        mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
        echo -e "${GREEN}✔ ดึงค่าคอนฟิกผ่าน API และบันทึกไปที่ $CONFIG_FILE สำเร็จ!${NC}"
    elif download_file "$MANAGER_URL/config/frpc.toml" "$CONFIG_FILE.tmp" && [ -s "$CONFIG_FILE.tmp" ]; then
        mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
        echo -e "${GREEN}✔ ดาวน์โหลดไฟล์คอนฟิกและบันทึกไปที่ $CONFIG_FILE สำเร็จ!${NC}"
    elif download_file "$MANAGER_URL/frpc.toml" "$CONFIG_FILE.tmp" && [ -s "$CONFIG_FILE.tmp" ]; then
        mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
        echo -e "${GREEN}✔ ดาวน์โหลดไฟล์คอนฟิกและบันทึกไปที่ $CONFIG_FILE สำเร็จ!${NC}"
    else
        rm -f "$CONFIG_FILE.tmp"
        echo -e "${RED}[ERROR] ไม่สามารถดาวน์โหลดคอนฟิกจาก $MANAGER_URL ได้ จะเปลี่ยนไปใช้การตั้งค่าด้วยตนเองแทน${NC}"
        CONFIG_CHOICE="2"
    fi
fi

if [ "$CONFIG_CHOICE" = "2" ]; then
    echo -e "\n${CYAN}--- กำหนดค่าคอนฟิกด้วยตนเอง ---${NC}"
    read -p "ระบุที่อยู่ Server IP / Domain (ค่าเริ่มต้น frp.ddshop-th.com): " SERVER_ADDR < /dev/tty 2>/dev/null
    SERVER_ADDR=${SERVER_ADDR:-frp.ddshop-th.com}
    
    read -p "ระบุพอร์ตของ FRP Server (ค่าเริ่มต้น 7005): " SERVER_PORT < /dev/tty 2>/dev/null
    SERVER_PORT=${SERVER_PORT:-7005}
    
    read -p "ระบุ Auth Token (ค่าเริ่มต้น MQBXdMQgOVp0Fh1N): " AUTH_TOKEN < /dev/tty 2>/dev/null
    AUTH_TOKEN=${AUTH_TOKEN:-MQBXdMQgOVp0Fh1N}
    
    read -p "ระบุชื่อ Proxy (เช่น my-web-app): " PROXY_NAME < /dev/tty 2>/dev/null
    PROXY_NAME=${PROXY_NAME:-my-web-app}
    
    read -p "ระบุพอร์ตภายในบนเครื่องนี้ที่ต้องการ Forward (เช่น 80 หรือ 3000): " LOCAL_PORT < /dev/tty 2>/dev/null
    LOCAL_PORT=${LOCAL_PORT:-80}
    
    read -p "ระบุชื่อโดเมนที่ต้องการเชื่อมต่อ (เช่น app.yourdomain.com): " CUSTOM_DOMAIN < /dev/tty 2>/dev/null
    CUSTOM_DOMAIN=${CUSTOM_DOMAIN:-app.yourdomain.com}

    cat <<EOF > "$CONFIG_FILE"
# FRP Client Configuration Generated by Installer
serverAddr = "$SERVER_ADDR"
serverPort = $SERVER_PORT
auth.token = "$AUTH_TOKEN"

[[proxies]]
name = "$PROXY_NAME"
type = "http"
localIP = "127.0.0.1"
localPort = $LOCAL_PORT
customDomains = ["$CUSTOM_DOMAIN"]
EOF
    echo -e "${GREEN}✔ สร้างไฟล์คอนฟิกที่ $CONFIG_FILE เรียบร้อยแล้ว${NC}"
fi

if [ "$CONFIG_CHOICE" = "3" ]; then
    if [ -f "$SCRIPT_DIR/config/frpc.toml" ]; then
        cp "$SCRIPT_DIR/config/frpc.toml" "$CONFIG_FILE"
        echo -e "${GREEN}✔ คัดลอกคอนฟิกไปที่ $CONFIG_FILE เรียบร้อยแล้ว${NC}"
    else
        echo -e "${YELLOW}[INFO] กำลังดาวน์โหลดไฟล์คอนฟิกมาตรฐานจาก $REPO_URL/config/frpc.toml ...${NC}"
        rm -f "$CONFIG_FILE.tmp"
        if download_file "$REPO_URL/config/frpc.toml" "$CONFIG_FILE.tmp" && [ -s "$CONFIG_FILE.tmp" ]; then
            mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
            echo -e "${GREEN}✔ ดาวน์โหลดคอนฟิกไปที่ $CONFIG_FILE เรียบร้อยแล้ว${NC}"
        elif download_file "$REPO_URL/frpc.toml" "$CONFIG_FILE.tmp" && [ -s "$CONFIG_FILE.tmp" ]; then
            mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
            echo -e "${GREEN}✔ ดาวน์โหลดคอนฟิกไปที่ $CONFIG_FILE เรียบร้อยแล้ว${NC}"
        else
            rm -f "$CONFIG_FILE.tmp"
            echo -e "${RED}[ERROR] ไม่พบไฟล์คอนฟิกทั้งในเครื่องและบนเว็บ ($REPO_URL/config/frpc.toml)${NC}"
            exit 1
        fi
    fi
fi

# Step 3: Create Systemd Service
echo -e "\n${BLUE}[3/4] สร้าง Systemd Background Service...${NC}"
cat <<EOF > "$SERVICE_FILE"
[Unit]
Description=FRP Client Service (Fast Reverse Proxy Client)
After=network.target network-online.target sys-subsystem-net-devices.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=$INSTALL_BIN -c $CONFIG_FILE
Restart=always
RestartSec=5s
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
EOF

echo -e "${GREEN}✔ สร้างไฟล์ Service ที่ $SERVICE_FILE สำเร็จ${NC}"

# Step 4: Enable and Start Service
echo -e "\n${BLUE}[4/4] เปิดใช้งานและเริ่มทำงาน FRP Client Service...${NC}"
systemctl daemon-reload
systemctl enable frpc > /dev/null 2>&1
systemctl restart frpc

sleep 2

if systemctl is-active --quiet frpc; then
    echo -e "\n${GREEN}====================================================================${NC}"
    echo -e "${GREEN}  🎉 ติดตั้งและเริ่มทำงาน FRP Client (frpc) เรียบร้อยแล้ว! 🎉  ${NC}"
    echo -e "${GREEN}====================================================================${NC}"
else
    echo -e "\n${YELLOW}====================================================================${NC}"
    echo -e "${YELLOW}  ⚠ Service ถูกสร้างแล้วแต่ไม่สามารถเริ่มทำงานได้ กรุณาเช็คล็อก ⚠  ${NC}"
    echo -e "${YELLOW}====================================================================${NC}"
fi

echo -e "\n${CYAN}📌 คำสั่งที่เป็นประโยชน์สำหรับจัดการ Service:${NC}"
echo -e "  🔹 เช็คสถานะการทำงาน : ${GREEN}sudo systemctl status frpc${NC}"
echo -e "  🔹 ดูล็อกเรียลไทม์     : ${GREEN}sudo journalctl -u frpc -f${NC}"
echo -e "  🔹 รีสตาร์ท Service  : ${GREEN}sudo systemctl restart frpc${NC}"
echo -e "  🔹 หยุดการทำงาน      : ${GREEN}sudo systemctl stop frpc${NC}"
echo -e "  🔹 แก้ไขคอนฟิก       : ${GREEN}sudo nano /etc/frp/frpc.toml${NC}\n"
