#!/bin/bash

# FRP Client 一键安装脚本
# 自动解压、配置和安装 frpc
# 使用方法: chmod +x install_frpc.sh && ./install_frpc.sh

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要root权限运行"
        exit 1
    fi
}

# 检查文件是否存在
check_files() {
    if [[ ! -f "frp_0.64.0_linux_amd64.tar.gz" ]]; then
        log_error "找不到 frp_0.64.0_linux_amd64.tar.gz 文件"
        exit 1
    fi
    
    if [[ ! -f "frpc.toml" ]]; then
        log_error "找不到 frpc.toml 配置文件"
        exit 1
    fi
}

# 创建frp用户
create_frp_user() {
    if ! id "frp" &>/dev/null; then
        log_info "创建 frp 用户..."
        useradd -r -s /bin/false frp
    else
        log_info "frp 用户已存在"
    fi
}

# 解压安装包
extract_archive() {
    log_info "解压 frp_0.64.0_linux_amd64.tar.gz..."
    
    # 创建临时目录
    TEMP_DIR=$(mktemp -d)
    
    # 解压到临时目录
    tar -xzf frp_0.64.0_linux_amd64.tar.gz -C "$TEMP_DIR"
    
    # 创建安装目录
    mkdir -p /root/frpc
    
    # 复制文件
    cp "$TEMP_DIR"/frp_0.64.0_linux_amd64/frpc /root/frpc/
    
    # 清理临时目录
    rm -rf "$TEMP_DIR"
    
    # 设置权限 - root目录需要特殊权限处理
    chmod 755 /root  # 确保frp用户可以访问root目录
    chown -R root:frp /root/frpc
    chmod 750 /root/frpc
    chmod +x /root/frpc/frpc
    
    log_info "frpc 已安装到 /root/frpc/"
}

# 配置frpc
configure_frpc() {
    log_info "配置 frpc..."
    
    # 复制配置文件
    cp frpc.toml /root/frpc/
    chown root:frp /root/frpc/frpc.toml
    chmod 640 /root/frpc/frpc.toml
    
    log_info "配置文件已复制到 /root/frpc/frpc.toml"
}

# 创建systemd服务
create_service() {
    log_info "创建 systemd 服务..."
    
    cat > /etc/systemd/system/frpc.service << 'EOF'
[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=frp
Restart=on-failure
RestartSec=5s
ExecStart=/root/frpc/frpc -c /root/frpc/frpc.toml
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5s

[Install]
WantedBy=multi-user.target
EOF

    # 重新加载systemd
    systemctl daemon-reload
    
    log_info "systemd 服务已创建"
}

# 启动服务
start_service() {
    log_info "启动 frpc 服务..."
    
    # 启用开机自启
    systemctl enable frpc
    
    # 启动服务
    systemctl start frpc
    
    # 检查服务状态
    if systemctl is-active --quiet frpc; then
        log_info "frpc 服务启动成功"
    else
        log_error "frpc 服务启动失败"
        log_error "请检查日志: journalctl -u frpc -f"
        exit 1
    fi
}

# 显示状态信息
show_status() {
    log_info "安装完成！"
    echo ""
    echo "服务状态:"
    systemctl status frpc --no-pager
    echo ""
    echo "常用命令:"
    echo "  启动服务: systemctl start frpc"
    echo "  停止服务: systemctl stop frpc"
    echo "  重启服务: systemctl restart frpc"
    echo "  查看状态: systemctl status frpc"
    echo "  查看日志: journalctl -u frpc -f"
    echo ""
    echo "配置文件位置: /root/frpc/frpc.toml"
    echo "程序位置: /root/frpc/frpc"
}

# 交互式服务管理菜单
interactive_menu() {
    while true; do
        echo ""
        echo "==============================================="
        echo "            FRP Client 服务管理"
        echo "==============================================="
        echo "1. 启动服务 (start)"
        echo "2. 停止服务 (stop)"
        echo "3. 重启服务 (restart)"
        echo "4. 查看状态 (status)"
        echo "5. 查看日志 (logs)"
        echo "6. 查看配置文件 (config)"
        echo "7. 编辑配置文件 (edit)"
        echo "8. 卸载服务 (uninstall)"
        echo "0. 退出 (exit)"
        echo "==============================================="
        
        read -p "请选择操作 [0-8]: " choice
        
        case $choice in
            1|start)
                log_info "启动 frpc 服务..."
                systemctl start frpc
                if systemctl is-active --quiet frpc; then
                    log_info "服务启动成功"
                else
                    log_error "服务启动失败"
                fi
                systemctl status frpc --no-pager
                ;;
            2|stop)
                log_info "停止 frpc 服务..."
                systemctl stop frpc
                log_info "服务已停止"
                ;;
            3|restart)
                log_info "重启 frpc 服务..."
                systemctl restart frpc
                if systemctl is-active --quiet frpc; then
                    log_info "服务重启成功"
                else
                    log_error "服务重启失败"
                fi
                systemctl status frpc --no-pager
                ;;
            4|status)
                echo "服务状态:"
                systemctl status frpc --no-pager
                ;;
            5|logs)
                log_info "查看服务日志 (按 Ctrl+C 退出):"
                sleep 1
                journalctl -u frpc -f
                ;;
            6|config)
                echo "配置文件内容:"
                echo "----------------------------------------"
                cat /root/frpc/frpc.toml
                echo "----------------------------------------"
                ;;
            7|edit)
                log_info "编辑配置文件..."
                if command -v nano >/dev/null 2>&1; then
                    nano /root/frpc/frpc.toml
                elif command -v vi >/dev/null 2>&1; then
                    vi /root/frpc/frpc.toml
                else
                    log_error "未找到文本编辑器，请手动编辑: /root/frpc/frpc.toml"
                fi
                
                read -p "是否重启服务使配置生效? [y/N]: " restart_choice
                if [[ $restart_choice =~ ^[Yy]$ ]]; then
                    systemctl restart frpc
                    log_info "服务已重启"
                fi
                ;;
            8|uninstall)
                read -p "确定要卸载 frpc 服务吗? [y/N]: " confirm
                if [[ $confirm =~ ^[Yy]$ ]]; then
                    log_warn "正在卸载 frpc 服务..."
                    systemctl stop frpc 2>/dev/null || true
                    systemctl disable frpc 2>/dev/null || true
                    rm -f /etc/systemd/system/frpc.service
                    systemctl daemon-reload
                    rm -rf /root/frpc
                    userdel -r frp 2>/dev/null || true
                    log_info "frpc 服务已完全卸载"
                    exit 0
                else
                    log_info "取消卸载操作"
                fi
                ;;
            0|exit|quit|q)
                log_info "退出管理界面"
                exit 0
                ;;
            *)
                log_error "无效选择，请输入 0-8 或对应命令"
                ;;
        esac
        
        read -p "按回车键继续..."
    done
}

# 主函数
main() {
    # 检查是否为管理模式
    if [[ "$1" == "manage" || "$1" == "menu" || "$1" == "-m" ]]; then
        interactive_menu
        return
    fi
    
    log_info "开始安装 FRP Client..."
    
    check_root
    check_files
    create_frp_user
    extract_archive
    configure_frpc
    create_service
    start_service
    show_status
    
    echo ""
    log_info "FRP Client 安装完成！"
    
    # 询问是否进入交互管理界面
    read -p "是否进入交互式管理界面? [y/N]: " enter_menu
    if [[ $enter_menu =~ ^[Yy]$ ]]; then
        interactive_menu
    else
        echo ""
        log_info "可使用以下命令管理服务:"
        echo "  ./install_frpc.sh manage   # 进入交互管理界面"
        echo "  systemctl [start|stop|restart|status] frpc"
    fi
}

# 运行主函数
main "$@"