#!/usr/bin/env bash
set -e

#############################################
# 配置：修改为你的项目路径
#############################################
# 方式1：手动指定路径（如果脚本不在项目根目录）
# PROJECT_DIR="/home/lizixuan/linux_client/windows-application"

# 方式2：自动检测（如果脚本放在项目根目录，推荐）
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"

#############################################
# 0. 打印环境信息
#############################################
echo "==== Linux Flutter 桌面环境初始化 & 构建脚本 ===="
echo "项目路径: $PROJECT_DIR"
echo "当前用户: $(whoami)"
echo "当前目录: $(pwd)"
echo

#############################################
# 1. 安装系统依赖（Ubuntu / Debian）
#############################################
echo "==== 1. 安装系统依赖（需要 sudo） ===="

sudo apt update

# 基本编译工具
sudo apt install -y build-essential

# CMake / Ninja（Flutter 构建需要）
sudo apt install -y cmake ninja-build

# GTK3 及相关开发包（Flutter Linux GUI 需要）
sudo apt install -y libgtk-3-dev libblkid-dev liblzma-dev

# SQLite 库（sqflite_common_ffi 需要）
sudo apt install -y libsqlite3-dev

# 常用工具
sudo apt install -y git curl unzip

echo "系统依赖安装完成"
echo

#############################################
# 2. 安装 Flutter SDK（如果还没有）
#############################################
echo "==== 2. 检查 Flutter 是否已安装 ===="

if ! command -v flutter >/dev/null 2>&1; then
  echo "未检测到 flutter 命令，开始安装 Flutter SDK..."

  FLUTTER_VERSION="3.16.0"  # 可按需要调整版本
  FLUTTER_TAR="flutter_linux_${FLUTTER_VERSION}-stable.tar.xz"
  FLUTTER_URL="https://storage.flutter-io.cn/flutter_infra_release/releases/stable/linux/${FLUTTER_TAR}"

  cd "$HOME"
  echo "从中国镜像下载 Flutter: $FLUTTER_URL"
  curl -O "$FLUTTER_URL"
  tar xf "$FLUTTER_TAR"

  # 写入 PATH（如果已经写入过，不会有问题）
  if ! grep -q "flutter/bin" "$HOME/.bashrc"; then
    echo 'export PATH="$PATH:$HOME/flutter/bin"' >> "$HOME/.bashrc"
  fi

  # 立刻生效当前 shell
  export PATH="$PATH:$HOME/flutter/bin"

  echo "Flutter 安装完成，版本：$(flutter --version)"
else
  echo "已检测到 Flutter：$(flutter --version)"
fi
echo

#############################################
# 3. 配置 Flutter 国内镜像
#############################################
echo "==== 3. 配置 Flutter 国内镜像环境变量 ===="

export PUB_HOSTED_URL="https://pub.flutter-io.cn"
export FLUTTER_STORAGE_BASE_URL="https://storage.flutter-io.cn"

# 写入 ~/.bashrc 方便下次登录继续使用
if ! grep -q "PUB_HOSTED_URL" "$HOME/.bashrc"; then
  cat >> "$HOME/.bashrc" << 'EOF'

# Flutter China mirrors
export PUB_HOSTED_URL="https://pub.flutter-io.cn"
export FLUTTER_STORAGE_BASE_URL="https://storage.flutter-io.cn"
EOF
fi

echo "国内镜像已配置（当前 shell 已生效）"
echo

#############################################
# 4. 启用 Linux 桌面支持
#############################################
echo "==== 4. 启用 Linux 桌面支持 ===="

flutter config --enable-linux-desktop

echo "flutter doctor 检查环境："
flutter doctor -v || true
echo

#############################################
# 5. 进入项目，生成 linux 工程（如未生成）
#############################################
echo "==== 5. 切换到项目目录，并生成 linux 工程（如需要） ===="

if [ ! -d "$PROJECT_DIR" ]; then
  echo "错误：项目目录不存在：$PROJECT_DIR"
  exit 1
fi

cd "$PROJECT_DIR"

# 如果没有 linux 目录，则创建
if [ ! -d "linux" ]; then
  echo "未检测到 linux 目录，执行 flutter create --platforms=linux ."
  
  # 从 pubspec.yaml 读取项目名（如果存在）
  PROJECT_NAME="cloud_client_gui"
  if [ -f "pubspec.yaml" ]; then
    # 尝试从 pubspec.yaml 提取 name 字段
    EXTRACTED_NAME=$(grep -E "^name:" pubspec.yaml | head -1 | sed 's/name:[[:space:]]*//' | sed 's/[[:space:]]*$//')
    if [ -n "$EXTRACTED_NAME" ]; then
      PROJECT_NAME="$EXTRACTED_NAME"
      echo "从 pubspec.yaml 读取到项目名: $PROJECT_NAME"
    fi
  fi
  
  # 使用 --project-name 参数明确指定项目名，避免目录名问题
  echo "使用项目名: $PROJECT_NAME 创建 linux 平台..."
  if flutter create --platforms=linux . --project-name "$PROJECT_NAME"; then
    echo "linux 平台创建成功"
  else
    echo "警告: flutter create 执行失败"
    echo "尝试不带 --project-name 参数重新执行..."
    flutter create --platforms=linux . || {
      echo "错误: 无法创建 linux 平台，请检查错误信息"
      echo "可以尝试手动执行: flutter create --platforms=linux . --project-name cloud_client_gui"
      exit 1
    }
  fi
else
  echo "已检测到 linux 目录，跳过 flutter create。"
fi
echo

#############################################
# 6. 获取依赖
#############################################
echo "==== 6. 获取 Dart / Flutter 依赖 ===="

flutter pub get
echo

#############################################
# 7. 构建 Linux Release 版本
#############################################
echo "==== 7. 构建 Linux Release 版本 ===="

flutter build linux --release

echo
echo "==== 构建完成 ===="
echo "可执行文件及运行目录位于："
echo "  $PROJECT_DIR/build/linux/x64/release/bundle/"
echo
echo "请确保将项目中的 bin/ 目录复制到该 bundle 目录同级，例如："
echo "  build/linux/x64/release/bundle/"
echo "    ├─ cloud_client_gui"
echo "    ├─ bin/"
echo "    │   ├─ version"
echo "    │   ├─ auth"
echo "    │   ├─ mining.linux.conf"
echo "    │   ├─ logs/"
echo "    │   └─ mining_task.db"
echo
echo "然后在该目录下运行："
echo "  ./cloud_client_gui"
echo
echo "==== 运行时依赖说明 ===="
echo "如果运行时提示找不到 libsqlite3.so，请确保已安装："
echo "  sudo apt install -y libsqlite3-dev"
echo "或者确保系统已安装 libsqlite3.so（通常在 /usr/lib/x86_64-linux-gnu/）"
echo
echo "全部步骤完成。"