#!/bin/bash
# ============================================================================
# srg-tui — SRG 交互式管理界面
# ============================================================================
# 纯 bash 实现，无需 dialog/whiptail 等外部依赖。
# 支持方向键导航、实时状态刷新。
# ============================================================================

set -uo pipefail

# 路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SRG="$SCRIPT_DIR/srg"
SSH_DIR="$HOME/.ssh"
SSH_CONFIG_SRG="$SSH_DIR/config.srg"
SSH_SOCKET_DIR="$SSH_DIR/sockets"

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
BOLD='\033[1m'
DIM='\033[2m'
INVERT='\033[7m'
NC='\033[0m'

# 状态
SELECTED=0
HOSTS=()
PORTS=()
STATES=()
ACTION_MSG=""

# ============================================================================
# 终端控制
# ============================================================================
hide_cursor() { printf '\033[?25l'; }
show_cursor() { printf '\033[?25h'; }
move_to()     { printf "\033[%d;%dH" "$1" "$2"; }
clear_line()  { printf '\033[2K'; }
clear_below() { printf '\033[J'; }

cleanup() {
    show_cursor
    tput cnorm 2>/dev/null || true
    stty echo 2>/dev/null || true
    echo ""
}
trap cleanup EXIT

# 读取单个按键（支持方向键）
read_key() {
    local key
    IFS= read -rsn1 key
    if [[ "$key" == $'\x1b' ]]; then
        read -rsn2 -t 0.1 key
        case "$key" in
            '[A') echo "UP" ;;
            '[B') echo "DOWN" ;;
            '[C') echo "RIGHT" ;;
            '[D') echo "LEFT" ;;
        esac
    else
        case "$key" in
            '') echo "ENTER" ;;
            *)  echo "$key" ;;
        esac
    fi
}

# ============================================================================
# 数据加载
# ============================================================================
load_hosts() {
    HOSTS=()
    PORTS=()
    STATES=()

    [ -f "$SSH_CONFIG_SRG" ] || return

    local hosts_raw
    hosts_raw=$(grep -o '^# --- SRG:\(.*\) ---$' "$SSH_CONFIG_SRG" 2>/dev/null \
        | grep -v 'END' \
        | sed 's/^# --- SRG:\(.*\) ---$/\1/' || true)

    [ -z "$hosts_raw" ] && return

    while IFS= read -r host; do
        [ -z "$host" ] && continue
        HOSTS+=("$host")

        # 提取端口
        local port
        port=$(grep -A3 "^# --- SRG:${host} ---" "$SSH_CONFIG_SRG" \
            | grep "RemoteForward" | awk '{print $2}' | head -1)
        PORTS+=("${port:-?}")

        # 检查连接状态
        local socket
        socket=$(ls "$SSH_SOCKET_DIR"/*"$host"* 2>/dev/null | head -1 || true)
        if [ -n "$socket" ]; then
            STATES+=("connected")
        else
            STATES+=("offline")
        fi
    done <<< "$hosts_raw"

    # 确保选中索引有效
    local count=${#HOSTS[@]}
    if [ $SELECTED -ge "$count" ] && [ "$count" -gt 0 ]; then
        SELECTED=$((count - 1))
    fi
}

# ============================================================================
# 绘制界面
# ============================================================================
draw_ui() {
    local term_cols term_lines
    term_cols=$(tput cols 2>/dev/null || echo 80)
    term_lines=$(tput lines 2>/dev/null || echo 24)

    # 清屏并定位到顶部
    printf '\033[2J'
    move_to 1 1

    # 标题
    echo -e "${BOLD}${CYAN}"
    echo "  ╔══════════════════════════════════════════════╗"
    echo "  ║       SRG — SSH Relay Guard       ║"
    echo "  ╚══════════════════════════════════════════════╝"
    echo -e "${NC}"

    # 主机列表
    local count=${#HOSTS[@]}

    if [ "$count" -eq 0 ]; then
        echo -e "  ${DIM}尚未配置任何主机${NC}"
        echo -e "  ${DIM}按 ${NC}${BOLD}a${NC}${DIM} 添加新主机${NC}"
        echo ""
    else
        # 表头
        printf "  ${DIM}%-3s  %-28s %-8s %-10s${NC}\n" "" "主机" "端口" "状态"
        echo -e "  ${DIM}─────────────────────────────────────────────${NC}"

        for i in $(seq 0 $((count - 1))); do
            local host="${HOSTS[$i]}"
            local port="${PORTS[$i]}"
            local state="${STATES[$i]}"
            local prefix="  "
            local suffix=""

            # 状态图标和颜色
            local status_str
            if [ "$state" = "connected" ]; then
                status_str="${GREEN}● 已连接${NC}"
            else
                status_str="${DIM}○ 未连接${NC}"
            fi

            if [ $i -eq $SELECTED ]; then
                printf "  ${INVERT}${BOLD} ▸ %-27s %-7s ${NC} %b\n" "$host" ":$port" "$status_str"
            else
                printf "    ${DIM}·${NC} %-27s ${DIM}:%-6s${NC} %b\n" "$host" "$port" "$status_str"
            fi
        done
        echo ""
    fi

    # 分隔线
    echo -e "  ${DIM}─────────────────────────────────────────────${NC}"

    # 操作菜单
    echo ""
    if [ "$count" -gt 0 ]; then
        echo -e "  ${BOLD}选中主机操作${NC}"
        echo -e "    ${CYAN}enter${NC}  状态详情    ${CYAN}d${NC}  问题排查    ${CYAN}t${NC}  卸载"
        echo ""
    fi
    echo -e "  ${BOLD}全局操作${NC}"
    echo -e "    ${CYAN}a${NC}  添加主机      ${CYAN}r${NC}  刷新         ${CYAN}q${NC}  退出"

    # 操作消息
    if [ -n "$ACTION_MSG" ]; then
        echo ""
        echo -e "  $ACTION_MSG"
    fi

    # 底部状态栏
    local bottom_line=$((term_lines - 1))
    move_to "$bottom_line" 1
    clear_line
    echo -en "  ${DIM}↑↓ 选择  Enter 详情  a 添加  d 诊断  t 卸载  r 刷新  q 退出${NC}"

    hide_cursor
}

# ============================================================================
# 操作：添加主机
# ============================================================================
action_setup() {
    show_cursor
    printf '\033[2J'
    move_to 1 1

    echo -e "${BOLD}${CYAN}添加新主机${NC}"
    echo ""

    echo -en "  远程主机名: "
    read -r new_host
    if [ -z "$new_host" ]; then
        ACTION_MSG="${YELLOW}⚠${NC} 已取消"
        return
    fi

    echo -en "  代理端口 ${DIM}[7890]${NC}: "
    read -r new_port
    new_port="${new_port:-7890}"

    echo ""
    echo -e "  ${DIM}正在执行 srg setup $new_host $new_port ...${NC}"
    echo ""

    bash "$SRG" setup "$new_host" "$new_port"

    echo ""
    echo -en "  ${DIM}按任意键返回...${NC}"
    read -rsn1
    ACTION_MSG="${GREEN}✓${NC} 已添加 ${BOLD}$new_host${NC}"
}

# ============================================================================
# 操作：状态详情
# ============================================================================
action_status() {
    local count=${#HOSTS[@]}
    [ "$count" -eq 0 ] && return

    local host="${HOSTS[$SELECTED]}"

    show_cursor
    printf '\033[2J'
    move_to 1 1

    bash "$SRG" status "$host"

    echo ""
    echo -en "  ${DIM}按任意键返回...${NC}"
    read -rsn1
}

# ============================================================================
# 操作：问题排查
# ============================================================================
action_doctor() {
    local count=${#HOSTS[@]}
    [ "$count" -eq 0 ] && return

    local host="${HOSTS[$SELECTED]}"

    show_cursor
    printf '\033[2J'
    move_to 1 1

    bash "$SRG" doctor "$host"

    echo ""
    echo -en "  ${DIM}按任意键返回...${NC}"
    read -rsn1
}

# ============================================================================
# 操作：卸载
# ============================================================================
action_teardown() {
    local count=${#HOSTS[@]}
    [ "$count" -eq 0 ] && return

    local host="${HOSTS[$SELECTED]}"

    show_cursor
    printf '\033[2J'
    move_to 1 1

    echo -e "${BOLD}${RED}卸载确认${NC}"
    echo ""
    echo -e "  即将卸载: ${BOLD}$host${NC}"
    echo ""
    echo -en "  ${YELLOW}?${NC} 确定要继续吗？[y/N] "
    read -r confirm

    if [[ "$confirm" =~ ^[Yy] ]]; then
        echo ""
        # 直接执行 teardown，跳过二次确认（TUI 已确认过了）
        echo "y" | bash "$SRG" teardown "$host"
        echo ""
        echo -en "  ${DIM}按任意键返回...${NC}"
        read -rsn1
        ACTION_MSG="${GREEN}✓${NC} 已卸载 ${BOLD}$host${NC}"
        SELECTED=0
    else
        ACTION_MSG="${DIM}已取消卸载${NC}"
    fi
}

# ============================================================================
# 主循环
# ============================================================================
main() {
    # 检查 srg 脚本
    if [ ! -x "$SRG" ]; then
        echo "错误: 找不到 srg 脚本: $SRG"
        exit 1
    fi

    while true; do
        load_hosts
        draw_ui

        local key
        key=$(read_key)
        ACTION_MSG=""

        local count=${#HOSTS[@]}

        case "$key" in
            UP|k)
                if [ $SELECTED -gt 0 ]; then
                    SELECTED=$((SELECTED - 1))
                fi
                ;;
            DOWN|j)
                if [ $SELECTED -lt $((count - 1)) ] && [ "$count" -gt 0 ]; then
                    SELECTED=$((SELECTED + 1))
                fi
                ;;
            ENTER)
                action_status
                ;;
            a|A)
                action_setup
                ;;
            d|D)
                action_doctor
                ;;
            t|T)
                action_teardown
                ;;
            r|R)
                ACTION_MSG="${GREEN}✓${NC} 已刷新"
                ;;
            q|Q)
                printf '\033[2J'
                move_to 1 1
                exit 0
                ;;
        esac
    done
}

main
