#!/bin/bash
set -x

DOWNLOAD_STATUS_FILE="/var/log/pkgs-download"
LOGIN_NAME=`loginctl | awk '{print $3}' | head --line=2 | tail -n 1`
LOGIN_UID=`loginctl | awk '{print $2}' | head --line=2 | tail -n 1`

# Send message
NotifyUser(){
    sleep 3
    sudo -u ${LOGIN_NAME} DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${LOGIN_UID}/bus \
            notify-send  -t $1 -i preferences-system "$2" 
}

# gsettings for power
Power_Gsettings(){
    SEARCH_BUS_ADDRESS="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${LOGIN_UID}/bus"

    sudo -u ${LOGIN_NAME} bash -c "env -i XAUTHORITY=/home/${LOGIN_NAME}/.Xauthority DISPLAY=:0 $SEARCH_BUS_ADDRESS HOME=/home/${LOGIN_NAME} \
    gsettings set com.deepin.dde.power $1 $2"
}

# Set power and battery property
Set_PowerProperty(){
#    Power_Gsettings line-power-lock-delay 0
    Power_Gsettings line-power-sleep-delay 0
    Power_Gsettings line-power-screen-black-delay 0
    Power_Gsettings line-power-lid-closed-action doNothing
#    Power_Gsettings battery-lock-delay 0
    Power_Gsettings battery-sleep-delay 0
    Power_Gsettings battery-screen-black-delay 0
    Power_Gsettings battery-lid-closed-action doNothing
}

# Close dde-control-center before update
Close_dde-control-center(){
    if [ `ps aux | grep dde-control-center | grep -v grep | wc -l` -eq 1 ];then
        kill -9 `ps aux | grep dde-control-center | grep -v grep | awk '{print $2}'`
    fi
}

# Check available updates
Check_UpdateAvailable(){
    apt-get update

    sleep 5
    NUM=`apt list --upgradable | wc -l`
    if [ $NUM -gt 1 ];then
        NotifyUser 5000 "系统开启更新自动检测与预下载"
    else
        NotifyUser 0 "没有可用的软件包更新，停止升级，请联系技术人员"
        exit -1
    fi
}

# Check backup
Check_Backup(){

    # Not check CanBackup
    #STATUS=$(dbus-send --system --dest=com.deepin.ABRecovery --type=method_call --print-reply --reply-timeout=2000 /com/deepin/ABRecovery com.deepin.ABRecovery.CanBackup | grep true | awk -F ' ' '{print $2}')

    STATUS='true'
    if [ x != x$STATUS ];then
        # Backup
        sleep 5
        NotifyUser 5000 "开始备份系统，请耐心等待"

        dbus-send --system --dest=com.deepin.ABRecovery --type=method_call --print-reply --reply-timeout=2000 /com/deepin/ABRecovery com.deepin.ABRecovery.StartBackup
        sleep 10

        # Check deepin-ab-recovery-backup mount
        while (lsblk | grep deepin-ab-recovery-backup)
        do
            sleep 5
        done

        NotifyUser 5000 "系统备份成功"
    else
        NotifyUser 0 "无法备份系统，停止升级，请联系技术人员"
        exit -2
    fi
}

Download_Pkgs(){
    # Download 
    echo "FAILED" > ${DOWNLOAD_STATUS_FILE}

    apt update
    NUM=`apt list --upgradable | wc -l`
    if [ $NUM -le 1 ];then
        exit -1
    fi

    for i in {1..5}
    do
       DEBIAN_FRONTEND=noninteractive apt-get -y -o APT::Status-Fd=3 -c /var/lib/lastore/apt.conf --allow-downgrades --allow-change-held-packages dist-upgrade -d || true
    done

    DEBIAN_FRONTEND=noninteractive apt-get -y -o APT::Status-Fd=3 -c /var/lib/lastore/apt.conf --allow-downgrades --allow-change-held-packages dist-upgrade -d
    if [ "$?" = "0" ];then
        echo "SUCCEED" > ${DOWNLOAD_STATUS_FILE}
    fi
}

Dist_Upgrade(){
    NotifyUser 0 "系统开始升级，建议保存文档，连接电源，切勿重启或关机"
    DEBIAN_FRONTEND=noninteractive apt-get -y -o APT::Status-Fd=3 -c /var/lib/lastore/apt.conf --allow-downgrades --allow-change-held-packages dist-upgrade

    if [ $? != 0 ];then
        NotifyUser 0 "系统升级失败，请联系技术人员" 
        exit -3
    fi

    apt-get update
    NUM=`apt list --upgradable | wc -l`
    if [ $NUM -gt 1 ];then
        DEBIAN_FRONTEND=noninteractive apt-get -y -o APT::Status-Fd=3 -c /var/lib/lastore/apt.conf --allow-downgrades --allow-change-held-packages dist-upgrade
        if [ $? != 0 ];then
            NotifyUser 0 "系统升级失败，请联系技术人员"
            exit -3
        fi
    fi

    NotifyUser 0 "升级完成，请重启系统" 

    exit 0
}

# Update OS must in desktop
Update_OS(){
    if [ `cat ${DOWNLOAD_STATUS_FILE}` != "SUCCEED" ];then
        exit 6
    fi

    while true
    do
        sleep 10
        if [ `ps -aux | grep dde-dock | grep -v grep | wc -l ` -ge 1 ];then
            Set_PowerProperty
            Close_dde-control-center
            Check_Backup
            Close_dde-control-center
            Dist_Upgrade
        fi
    done
}

Update_Now(){
    Check_UpdateAvailable
    Download_Pkgs
    Update_OS
}

# dde-control-center interface
Update_Shutdown(){
    gsettings set com.deepin.dde.control-center update-update-notify true
    gsettings set com.deepin.dde.control-center update-auto-downlaod true
    gsettings set com.deepin.dde.control-center update-before-shutdown-reboot true
}

# dde-control-center interface
Update_Reboot(){
    gsettings set com.deepin.dde.control-center update-update-notify true
    gsettings set com.deepin.dde.control-center update-auto-downlaod true
    gsettings set com.deepin.dde.control-center update-before-shutdown-reboot true
}

SetTime_Update(){ if [ -z $1 ];then
        echo "timestamp is empty!"
        exit -4
    fi

    hou=$(date -d @$1 +%H)
    min=$(date -d @$1 +%M)

    Download_Pkgs

    NotifyUser 0 "系统将于${hou}点${min}分更新"

    sed -i '/icbc-update-policy/d' /etc/crontab

    echo "${min} ${hou}   * * *   root    /usr/sbin/icbc-update-policy -u > /var/log/icbc-update-policy.log 2>&1" >> /etc/crontab
}

Usage(){
    echo "Usage: $(basename $0) -d -n -r -s -t timestamp -u"
    exit -5
}

# Use getopt to process options and arguments
ARGUMENTS=$(getopt -q -n $(basename $0) -o dnrsut: -- "$@")

if [ "$?" != "0" ]; then
    Usage
    exit -6
fi

eval set -- "${ARGUMENTS}"

case "$1" in
    -d)    Download_Pkgs;;
    -n)    Update_Now;;
    -r)    Update_Reboot;;
    -s)    Update_Shutdown;;
    -t)    SetTime_Update $2;;
    -u)    Update_OS;;
    *)     Usage;;
esac
