#!/usr/bin/env bash
set -o errexit

# configuration
ENDPOINT="https://api.hulu.deckz.fun"
DECKZ_DIR=/home/deck/.fun.deckz
WORK_DIR=${DECKZ_DIR}/hulu
CHANNEL=Stable
DECK_SN=$(dmidecode -s system-serial-number)
RESET_PACMAN_PROMPT="\n可能是你的Pacman配置有问题，你可以执行下面的命令来重置:\n \033[40;32m curl -s -L https://i.hulu.deckz.fun/reset_pacman.sh | sudo sh - \033[0m \n重置后请重新安装宝葫芦。"

if [ "${HULU_CHANNEL}" != "" ]; then
  CHANNEL=${HULU_CHANNEL}
fi
echo "安装通道: ${CHANNEL}"

function remember_and_disable_readonly_mode() {
  local last_status=$(steamos-readonly status)
  if [ "${last_status}" == "enabled" ]; then
    steamos-readonly disable
  fi

  unset last_status
}

function recovery_readonly_mode_from_disable() {
  local last_status=$1
  if [ "${last_status}" == "enabled" ]; then
    steamos-readonly enable
  fi
  unset last_status
}

function checkRoot() {
  set -e

  echo "检查所需要的权限 ... "
  if [ $EUID -ne 0 ]; then
    echo "你应该使用root用户来执行这个脚本哦。不会？我教你啊：在命令前增加 sudo 哦。"
    exit
  fi
  echo "检查通过！"
}

function installDependencies() {
  echo "正在安装依赖 ..."
  pacman-key --init || (echo -e "${RESET_PACMAN_PROMPT}" && exit 1)
  pacman-key --populate || (echo -e "${RESET_PACMAN_PROMPT}" && exit 1)
  pacman -S --noconfirm --needed libxcrypt-compat jq || (echo -e "${RESET_PACMAN_PROMPT}" && exit 1)
  echo "依赖安装完成。"
}

function cleanOldVersion() {
  if [ -e /opt/fun.deckz/hulu ] || [ -e /home/deck/.fun.deckz/hulu ]; then
    echo "发现旧版本宝葫芦，卸载旧版本 ..."
    curl -L https://i.hulu.deckz.fun/u.sh | sudo sh -
  fi
}

function prepare() {
  echo "正在准备安装目录 ..."
  mkdir -p ${WORK_DIR}
  mkdir -p ${WORK_DIR}/var
  mkdir -p ${WORK_DIR}/cache

#  mkdir -p ${WORK_DIR}/data
#  mkdir -p ${WORK_DIR}/etc
  echo "安装目录准备完成。"
}

function installPackage() {
  set -e

  # get hulu package download url
  echo "正在查询最新的 宝葫芦 版本 ..."
  VERSION_RESPONSE=$(curl -k -X POST "$ENDPOINT"/api/versions/v1alpha1/latest -H "Content-Type: application/json" \
    -H "X-Hulu-Version: 0.0.1" -H "X-Hulu-Channel: ${CHANNEL}" -H "X-Hulu-Deck-SN: ${DECK_SN}" \
    -d '{"current":{"version":"0.0.1"}, "reason": "Install"}')

  if [ "$(echo "$VERSION_RESPONSE" | jq .status.code)" != 0 ]; then
    echo "查询最新的 宝葫芦 版本失败啦。退出安装啦。"
    exit
  fi

  echo "正在安装 宝葫芦 ..."
  HULU_DOWNLOAD_URL=$(echo "$VERSION_RESPONSE" | jq .data.downloadUrl | sed -e 's/"//g')

  # TODO: wget test failed
  wget "$HULU_DOWNLOAD_URL" -O /tmp/hulu.tar.xz && tar -Jxf /tmp/hulu.tar.xz -C ${WORK_DIR} && rm -rf /tmp/hulu.tar.xz

  # Adjust Permission
  chown -R deck:deck ${DECKZ_DIR}
  chown root:root ${WORK_DIR}/app/deckmeta/deckmeta && chmod a+s ${WORK_DIR}/app/deckmeta/deckmeta
  chown root:root ${WORK_DIR}/app/flatpak/flatpak && chmod a+s ${WORK_DIR}/app/flatpak/flatpak
  chown root:root ${WORK_DIR}/app/optimizer/optimizer && chmod a+s ${WORK_DIR}/app/optimizer/optimizer
  chown root:root ${WORK_DIR}/app/decky_loader/decky_loader && chmod a+s ${WORK_DIR}/app/decky_loader/decky_loader
  chown root:root ${WORK_DIR}/app/supervisor/app/proxy/proxy && chmod a+s ${WORK_DIR}/app/supervisor/app/proxy/proxy
  chown root:root ${WORK_DIR}/app/servicekeeper/servicekeeper && chmod a+s ${WORK_DIR}/app/servicekeeper/servicekeeper
  chown root:root ${WORK_DIR}/app/supervisor/supervisord && chmod a+s ${WORK_DIR}/app/supervisor/supervisord
}

function installDesktopEntry() {
  ln -s ${WORK_DIR}/app/hulu.desktop /home/deck/Desktop/hulu.desktop
  chmod a+x /home/deck/Desktop/hulu.desktop
}

function main() {
  echo "宝葫芦 现在开始安装啦 ... "
  checkRoot
  last_steamos_readonly_status=$(remember_and_disable_readonly_mode)
  cleanOldVersion
  installDependencies
  prepare
  installPackage
  installDesktopEntry
  recovery_readonly_mode_from_disable "${last_steamos_readonly_status}"
  echo "宝葫芦 安装成功啦！体验一下吧！"
}

main
