#!/bin/bash
# 3588AdminBackend 离线部署包构建脚本
# 在联网机器上执行，生成可刻录到光盘的部署包

set -e

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

# 配置
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
BUILD_DIR="$PROJECT_DIR/build"
PACKAGE_NAME="3588AdminBackend-离线部署包-$(date +%Y%m%d)"
PACKAGE_DIR="$BUILD_DIR/$PACKAGE_NAME"

# Go版本检测
GO_VERSION=$(go version 2>/dev/null | awk '{print $3}')

# 检查Go（仅在构建机上需要）
command -v go >/dev/null 2>&1 || { 
    echo -e "${RED}错误: 未找到 Go 命令${NC}"
    echo "请在联网的构建机上运行此脚本"
    exit 1
}

echo -e "${GREEN}========== 3588AdminBackend 离线部署包构建 ==========${NC}"
echo "项目目录: $PROJECT_DIR"
echo "构建目录: $BUILD_DIR"
echo "Go 版本: $GO_VERSION"
echo ""
echo -e "${YELLOW}说明: 此脚本在联网机器上运行，生成包含静态二进制文件的离线部署包${NC}"
echo -e "${YELLOW}      目标机器（生产环境）无需安装 Go 运行时${NC}"
echo ""

# 清理旧的构建
echo "[1/7] 清理旧构建..."
rm -rf "$BUILD_DIR"
mkdir -p "$PACKAGE_DIR"

# 创建目录结构
echo "[2/7] 创建目录结构..."
mkdir -p "$PACKAGE_DIR"/{bin,config,scripts,deps,docs,systemd}

# 编译项目
echo "[3/7] 编译项目..."
cd "$PROJECT_DIR"

echo "  编译 Linux AMD64 版本..."
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o "$PACKAGE_DIR/bin/safesightd" ./cmd/safesightd

echo "  验证编译结果..."
if [ ! -f "$PACKAGE_DIR/bin/safesightd" ]; then
    echo -e "${RED}错误: 编译失败${NC}"
    exit 1
fi

FILE_INFO=$(file "$PACKAGE_DIR/bin/safesightd")
echo "  $FILE_INFO"

# 复制配置文件
echo "[4/7] 复制配置文件..."
if [ -f "$PROJECT_DIR/safesightd.json" ]; then
    cp "$PROJECT_DIR/safesightd.json" "$PACKAGE_DIR/config/safesightd.json.example"
else
    # 创建默认配置示例
    cat > "$PACKAGE_DIR/config/safesightd.json.example" << 'EOF'
{
  "listen": "0.0.0.0:18080",
  "discovery_port": 35688,
  "discovery_timeout_ms": 1200,
  "offline_after_ms": 10000,
  "agent_token": "CHANGE_ME",
  "concurrency": 5
}
EOF
fi

# 复制模板文件（如果有）
if [ -d "$PROJECT_DIR/templates" ]; then
    echo "  复制模板文件..."
    cp -r "$PROJECT_DIR/templates" "$PACKAGE_DIR/"
fi

# 复制脚本
echo "[5/7] 复制部署脚本..."
cp "$SCRIPT_DIR/3588admin" "$PACKAGE_DIR/scripts/"
chmod +x "$PACKAGE_DIR/scripts/3588admin"
cp "$SCRIPT_DIR/3588admin.service" "$PACKAGE_DIR/systemd/"

# 复制文档
echo "[6/7] 复制文档..."
if [ -d "$PROJECT_DIR/docs" ]; then
    cp "$PROJECT_DIR/docs"/*.md "$PACKAGE_DIR/docs/" 2>/dev/null || true
fi
if [ -f "$PROJECT_DIR/Readme.md" ]; then
    cp "$PROJECT_DIR/Readme.md" "$PACKAGE_DIR/docs/"
fi
if [ -f "$PROJECT_DIR/API_Device_RemoteMgmt_InterfaceTable.md" ]; then
    cp "$PROJECT_DIR/API_Device_RemoteMgmt_InterfaceTable.md" "$PACKAGE_DIR/docs/"
fi

# 创建版本信息
cat > "$PACKAGE_DIR/VERSION" << EOF
3588AdminBackend 离线部署包
版本: 1.0.0
构建时间: $(date '+%Y-%m-%d %H:%M:%S')
Go版本: $GO_VERSION
目标系统: Ubuntu 22.04.5 LTS x86_64
构建主机: $(hostname)
EOF

# 创建快速安装说明
cat > "$PACKAGE_DIR/README-离线安装.txt" << 'EOF'
╔══════════════════════════════════════════════════════════════╗
║         3588AdminBackend 离线部署包 - 快速安装指南            ║
╚══════════════════════════════════════════════════════════════╝

【系统要求】
  - Ubuntu 22.04.5 LTS (x86_64)
  - root 权限
  
【重要说明】
  ✓ 本部署包已包含静态编译的二进制文件
  ✓ 目标机器无需安装 Go 运行时
  ✓ 无需互联网连接（纯离线安装）

【安装步骤】

1. 解压部署包（如需要）
   tar -xzf 3588AdminBackend-离线部署包-*.tar.gz
   cd 3588AdminBackend-离线部署包-*/

2. 执行安装脚本
   sudo ./scripts/3588admin install

   或指定自定义安装目录:
   sudo ./scripts/3588admin install /usr/local/3588admin

3. 修改配置
   sudo nano /opt/3588admin/config/safesightd.json
   
   重点修改:
   - agent_token: 修改为安全的随机字符串
   - listen: 如需外部访问改为 "0.0.0.0:18080"

4. 启动服务
   sudo 3588admin start
   
   或 Systemd 方式:
   sudo systemctl start 3588admin
   sudo systemctl enable 3588admin  # 开机自启

5. 验证安装
   sudo 3588admin status
   curl http://127.0.0.1:18080/api/devices

【常用命令】
  3588admin start     - 启动服务
  3588admin stop      - 停止服务  
  3588admin status    - 查看状态
  3588admin restart   - 重启服务
  3588admin upgrade   - 升级服务
  3588admin uninstall - 卸载服务
  3588admin check     - 检查环境

【快捷命令】
  3588admin-start     - 启动服务
  3588admin-stop      - 停止服务
  3588admin-status    - 查看状态

【文件位置】
  安装目录: /opt/3588admin
  配置文件: /opt/3588admin/config/safesightd.json
  日志文件: /opt/3588admin/logs/safesightd.log

【问题排查】
  1. 查看日志: tail -f /opt/3588admin/logs/safesightd.log
  2. 检查配置: python3 -m json.tool /opt/3588admin/config/safesightd.json
  3. 检查端口: sudo netstat -tlnp | grep safesightd

【防火墙】
  sudo ufw allow 18080/tcp   # HTTP API
  sudo ufw allow 35688/udp   # UDP 发现

EOF

# 打包
echo "[7/7] 打包..."
cd "$BUILD_DIR"

echo "  创建 tar.gz 包..."
tar -czf "${PACKAGE_NAME}.tar.gz" "$PACKAGE_NAME/"

# 计算校验和
echo "  生成校验和..."
sha256sum "${PACKAGE_NAME}.tar.gz" > "${PACKAGE_NAME}.tar.gz.sha256"

# 完成
echo ""
echo -e "${GREEN}========== 构建完成 ==========${NC}"
echo ""
echo "输出文件:"
ls -lh "$BUILD_DIR/${PACKAGE_NAME}".*
echo ""
echo -e "${YELLOW}使用说明:${NC}"
echo "1. 将构建好的包刻录到光盘或复制到 USB"
echo "2. 挂载到目标 Ubuntu 22.04 服务器"
echo "3. 解压并运行 sudo ./scripts/3588admin install"
echo ""
echo -e "${YELLOW}验证校验和:${NC}"
echo "  cd $BUILD_DIR"
echo "  sha256sum -c ${PACKAGE_NAME}.tar.gz.sha256"
