#!/usr/bin/env bash

## 设置 iCloud 云盘路径
#ICLOUD_PATH="$HOME/Library/Mobile Documents/com~apple~CloudDocs"
## 获取本机名称
#COMPUTER_NAME=$(scutil --get ComputerName)
## 获取当前用户名（作为子文件夹名称）注意，自动删除用户名中的所有空格！
#USER_NAME=$USER
## 备份目录的起始路径！！
#BACKUP_PATH="$ICLOUD_PATH/BACKUP/$COMPUTER_NAME/$USER_NAME"
## 备份根目录！！
#PATH_LaunchpadLayout_BACKUP="$BACKUP_PATH/LaunchpadLayout"


# 路径：保存日志文件的路径
ICLOUD_PATH="$HOME/Library/Mobile Documents/com~apple~CloudDocs"            # 获取 iCloud 云盘路径，
# 生成用于标识设备的目录名称。格式为“型号名称-芯片名称-序列号/用户名”。
# 型号名称取自系统信息的 Model Name 并删除空格；芯片名称去掉 Apple 前缀并删除所有空格；序列号读取系统序列号。
MODEL_NAME_RAW=$(system_profiler SPHardwareDataType 2>/dev/null | awk -F: '/Model Name/{print $2; exit}')
MODEL_NAME_CLEAN=$(echo "${MODEL_NAME_RAW}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/[[:space:]]//g')
CPU_BRAND_RAW=$(sysctl -n machdep.cpu.brand_string 2>/dev/null)
CPU_BRAND_TRIM=$(echo "${CPU_BRAND_RAW}" | sed 's/^Apple[[:space:]]*//;s/^[[:space:]]*//;s/[[:space:]]*$//')
CPU_BRAND_CLEAN=$(echo "${CPU_BRAND_TRIM}" | sed 's/[[:space:]]//g')
SERIAL_NUMBER_RAW=$(system_profiler SPHardwareDataType 2>/dev/null | awk -F: '/Serial Number/{print $2; exit}')
SERIAL_NUMBER_CLEAN=$(echo "${SERIAL_NUMBER_RAW}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
USER_NAME="${USER:-$(whoami)}"
DEVICE_DIR="${MODEL_NAME_CLEAN}-${CPU_BRAND_CLEAN}-${SERIAL_NUMBER_CLEAN}"
# 清理多余的连字符
DEVICE_DIR=$(echo "$DEVICE_DIR" | sed 's/--*/-/g; s/^-//; s/-$//')

USER_ID=$(basename "$(dirname "$userTmpDir")")      # 提取TMPDIR路径中的随机目录ID
PARENT_DIR=$(find /System/Volumes/Data/private/var/folders/ -maxdepth 2 -type d -name "$USER_ID" -print -quit 2>/dev/null)
# 根据新的目录规则生成 BACKUP 路径。以设备标识目录（型号名称-芯片名称-序列号）为基础，并包含用户名目录。
BACKUP_BASE="$ICLOUD_PATH/BACKUP/${DEVICE_DIR}"
# 如果 BACKUP_BASE 末尾已包含用户名，则不再追加；否则追加用户名目录。
if [[ "$BACKUP_BASE" == */"$USER_NAME" ]]; then
    BACKUP_PATH="$BACKUP_BASE"
else
    BACKUP_PATH="$BACKUP_BASE/$USER_NAME"
fi


PATH_LaunchpadLayout_BACKUP="$BACKUP_PATH/LaunchpadLayout"


# 检查备份目录是否存在
if [ ! -d "$PATH_LaunchpadLayout_BACKUP" ]; then
    echo -e "错误：备份目录 $PATH_LaunchpadLayout_BACKUP 不存在"
    exit 1
fi

# 扫描所有备份日期，并按日期降序排序
BACKUP_DATES=($(ls -1 "$PATH_LaunchpadLayout_BACKUP" | sort -r))

# 检查是否有备份
if [ ${#BACKUP_DATES[@]} -eq 0 ]; then
    echo -e "错误：没有找到任何备份日期"
    exit 1
fi

# 显示可用的备份日期并让用户选择
echo -e "可用的备份日期（从新到旧）："
for i in "${!BACKUP_DATES[@]}"; do
    echo -e "$((i+1)). ${BACKUP_DATES[$i]}"
done

read -p "请输入要还原的日期编号: " SELECTED_INDEX

# 验证用户输入是否有效
if ! [[ "$SELECTED_INDEX" =~ ^[0-9]+$ ]] || [ "$SELECTED_INDEX" -lt 1 ] || [ "$SELECTED_INDEX" -gt "${#BACKUP_DATES[@]}" ]; then
    echo -e "错误：无效的编号"
    exit 1
fi

# 获取用户选择的日期和对应的备份目录
SELECTED_DATE="${BACKUP_DATES[$((SELECTED_INDEX-1))]}"
SELECTED_BACKUP_DIR="$PATH_LaunchpadLayout_BACKUP/$SELECTED_DATE"

# 设置原始文件路径
PATH_LaunchpadLayout_SOURCE1="$HOME/Library/Preferences"

# 动态获取 com.apple.dock.launchpad 的原始路径
USER_ID=$(basename "$(dirname "$TMPDIR")")
PARENT_DIR=$(find /System/Volumes/Data/private/var/folders/ -maxdepth 2 -type d -name "$USER_ID" 2>/dev/null)
PATH_LaunchpadLayout_SOURCE2="$PARENT_DIR/0"

# 命令行等效命令
# echo -e $(find $(find /System/Volumes/Data/private/var/folders/ -maxdepth 2 -type d -name "$(basename "$(dirname "$TMPDIR")")" 2>/dev/null) -maxdepth 2 -type d -name "com.apple.dock.launchpad" 2>/dev/null)

# 检查备份文件是否存在
if [ ! -f "$SELECTED_BACKUP_DIR/com.apple.spaces.plist" ] || \
   [ ! -f "$SELECTED_BACKUP_DIR/com.apple.dock.plist" ] || \
   [ ! -d "$SELECTED_BACKUP_DIR/com.apple.dock.launchpad" ]; then
    echo -e "错误：所选日期的备份文件不完整"
    exit 1
fi

# 执行还原操作
echo -e "正在还原备份..."
cp -f "$SELECTED_BACKUP_DIR/com.apple.spaces.plist" "$PATH_LaunchpadLayout_SOURCE1/com.apple.spaces.plist"
cp -f "$SELECTED_BACKUP_DIR/com.apple.dock.plist" "$PATH_LaunchpadLayout_SOURCE1/com.apple.dock.plist"
sudo cp -rf "$SELECTED_BACKUP_DIR/com.apple.dock.launchpad" "$PATH_LaunchpadLayout_SOURCE2"

# 重启 Dock 以应用更改
killall Dock

# 显示完成信息
echo -e "还原 “Launchpad 布局” 已完成！"