#!/bin/bash

# Copyright HamoniKR Team. All rights reserved.
# Script to install the HamoniKR repo onto a Debian or Ubuntu system.
#
# Run as below:
# curl -sL https://repo.hamonikr.org/kumkang.upgrade | sudo -E bash -
#   or
# wget -qO- https://repo.hamonikr.org/kumkang.upgrade | sudo -E bash -
#

export DEBIAN_FRONTEND=noninteractive

print_status() {
    echo
    echo "## $1"
    echo
}

if test -t 1; then # if terminal
    ncolors=$(which tput > /dev/null && tput colors) # supports color
    if test -n "$ncolors" && test $ncolors -ge 8; then
        termcols=$(tput cols)
        bold="$(tput bold)"
        underline="$(tput smul)"
        standout="$(tput smso)"
        normal="$(tput sgr0)"
        black="$(tput setaf 0)"
        red="$(tput setaf 1)"
        green="$(tput setaf 2)"
        yellow="$(tput setaf 3)"
        blue="$(tput setaf 4)"
        magenta="$(tput setaf 5)"
        cyan="$(tput setaf 6)"
        white="$(tput setaf 7)"
    fi
fi

print_bold() {
    title="$1"
    text="$2"

    echo
    echo "${red}======================================================${normal}"
    echo "${red}======================================================${normal}"
    echo
    echo -e " ${bold}${cyan}${title}${normal}"
    echo -en "  ${text}"
    echo
    echo "${red}======================================================${normal}"
    echo "${red}======================================================${normal}"
}

bail() {
    echo 'Error executing command, exiting'
    exit 1
}

exec_cmd_nobail() {
    echo "+ $1"
    bash -c "$1"
}

exec_cmd() {
    exec_cmd_nobail "$1" || bail
}

hinstall() {
    # 물어보는 창 없이 자동으로 새 패키지의 설정을 이용해서 설치
    exec_cmd "bash -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y --assume-yes  --option Dpkg::Options::=--force-confnew $1'"
}

setup() {

print_status "Installing the HamoniKR Repo..."

if $(uname -m | grep -Eq ^armv6); then
   print_status "You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the HamoniKR OS."
   exit 1
fi

PRE_INSTALL_PKGS=""

# Check that HTTPS transport is available to APT

if [ ! -e /usr/lib/apt/methods/https ]; then
    PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} apt-transport-https"
fi

if [ ! -x /usr/bin/lsb_release ]; then
    PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} lsb-release"
fi

if [ ! -x /usr/bin/curl ] && [ ! -x /usr/bin/wget ]; then
    PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} curl"
fi

# Used by apt-key to add new keys

if [ ! -x /usr/bin/gpg ]; then
    PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} gnupg"
fi

if [ "X${PRE_INSTALL_PKGS}" != "X" ]; then
    print_status "Installing packages required for setup:${PRE_INSTALL_PKGS}..."
    # This next command needs to be redirected to /dev/null or the script will bork
    # in some environments
    exec_cmd "apt-get install -y${PRE_INSTALL_PKGS} > /dev/null 2>&1"
fi

# check os infomation
DistributorID=$(lsb_release -i -s)
RELEASE=$(lsb_release -d -s)
CODENAME=$(lsb_release -c -s)

check_alt_hamonikr() {
    if [ "X${RELEASE}" == "X${2}" ]; then
        echo
        echo "## You seem to be using ${1} version ${RELEASE}."
        echo "## This maps to ${3} \"${4}\"... Adjusting for you..."
        DISTRO="${4}"
    fi
}

if [ "X${DistributorID}" != "XHamoniKR" ]; then
    print_status "Detected ${DistributorID}"
else
    check_alt_hamonikr "HamoniKR" "me" "HamoniKR" "me"
    check_alt_hamonikr "HamoniKR" "sun" "HamoniKR" "sun"
    check_alt_hamonikr "HamoniKR" "jin" "HamoniKR" "jin"
    check_alt_hamonikr "HamoniKR" "hanla" "HamoniKR" "hanla"
    check_alt_hamonikr "HamoniKR" "taebaek" "HamoniKR" "taebaek"
fi


### START Job
# Remove previous HamoniKR APT
if [[ -f "/etc/apt/sources.list.d/hamonikr.list" ]]; then
    exec_cmd "rm -f /etc/apt/sources.list.d/hamonikr.list"
    print_status 'Removing Repository for Previous HamoniKR APT Repo'
fi

if [[ -f "/etc/apt/sources.list.d/hamonikr-pkg.list" ]]; then
    exec_cmd "rm -f /etc/apt/sources.list.d/hamonikr-pkg.list"
    print_status 'Removing Repository for Previous HamoniKR PKGs APT Repo'
fi

if [[ -f "/etc/apt/sources.list.d/hamonikr-app.list" ]]; then
    exec_cmd "rm -f /etc/apt/sources.list.d/hamonikr-app.list"
    print_status 'Removing Repository for Previous HamoniKR Applications Repo'
fi

# INSTALL APT KEY AND REPO LIST
print_status 'Adding the HamoniKR Applications APT...'

# Register apt repository
eval $(apt-config shell APT_SOURCE_PARTS Dir::Etc::sourceparts/d)
HAMONIKR_SOURCE_PART=${APT_SOURCE_PARTS}hamonikr.list

eval $(apt-config shell APT_TRUSTED_PARTS Dir::Etc::trustedparts/d)
HAMONIKR_TRUSTED_PART=${APT_TRUSTED_PARTS}hamonikr.gpg

# Install repository source list
WRITE_SOURCE=0
if [ ! -f $HAMONIKR_SOURCE_PART ] ; then
    # Write source list if it does not exist
    WRITE_SOURCE=1
elif grep -Eq "http:\/\/repo\.hamonikr\.org" $HAMONIKR_SOURCE_PART; then
    # Migrate from old repository
    WRITE_SOURCE=1
elif grep -q "# disabled on upgrade to" $HAMONIKR_SOURCE_PART; then
    # Write source list if it was disabled by OS upgrade
    WRITE_SOURCE=1
fi

if [ "$WRITE_SOURCE" -eq "1" ]; then
	echo "### THIS FILE IS AUTOMATICALLY CONFIGURED ###"
	echo "# Ubuntu 22.04 jammy compatible applications" > $HAMONIKR_SOURCE_PART
	echo "deb [arch=amd64] https://repo.hamonikr.org jammy main extra" >> $HAMONIKR_SOURCE_PART
	echo "# deb-src [arch=amd64] https://repo.hamonikr.org jammy main extra" >> $HAMONIKR_SOURCE_PART
	echo "" >> $HAMONIKR_SOURCE_PART
	echo "# HamoniKR OS specfic applications" >> $HAMONIKR_SOURCE_PART
	echo "deb [arch=amd64] https://repo.hamonikr.org kumkang main extra" >> $HAMONIKR_SOURCE_PART
	echo "# deb-src [arch=amd64] https://repo.hamonikr.org kumkang main extra" >> $HAMONIKR_SOURCE_PART
fi

# Change Korea LinuxMint mirror
mint_apt_file="/etc/apt/sources.list.d/official-package-repositories.list"
if [ -f "$mint_apt_file" ]; then
    	exec_cmd "cp $mint_apt_file ${mint_apt_file}.bak"
    	print_status 'Change APT mirror server at Korea...'

	echo "# LinuxMint APT" > $mint_apt_file
	echo "deb https://ftp.kaist.ac.kr/linuxmint victoria main upstream import backport" >> $mint_apt_file
	echo "" >> $mint_apt_file
	echo "# Ubuntu APT" >> $mint_apt_file
	echo "deb https://mirror.kakao.com/ubuntu jammy main restricted universe multiverse" >> $mint_apt_file
	echo "deb https://mirror.kakao.com/ubuntu jammy-updates main restricted universe multiverse" >> $mint_apt_file
	echo "deb https://mirror.kakao.com/ubuntu jammy-backports main restricted universe multiverse" >> $mint_apt_file
	echo "deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse" >> $mint_apt_file
fi

# 새 ppa 추가
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EF6C07F6
sudo rm -f /etc/apt/trusted.gpg.d/whale-key.gpg
sudo apt-key export EF6C07F6 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/whale-key.gpg
echo "deb [arch=amd64] http://repo.whale.naver.com/stable/deb stable main" > /etc/apt/sources.list.d/naver-whale.list

sudo rm -f /usr/share/keyrings/google-chrome-archive-keyring.gpg
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome-archive-keyring.gpg
chmod a+r /usr/share/keyrings/google-chrome-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome-archive-keyring.gpg] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list

sudo rm -f /usr/share/keyrings/packages.microsoft.gpg
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/packages.microsoft.gpg
chmod a+r /usr/share/keyrings/packages.microsoft.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list

sudo rm -f /etc/apt/trusted.gpg.d/lutris-team-ubuntu-lutris.gpg
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 4E3EFAE4
sudo apt-key export 4E3EFAE4 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/lutris-team-ubuntu-lutris.gpg
echo "deb [arch=amd64] https://ppa.launchpadcontent.net/lutris-team/lutris/ubuntu/ jammy main" > /etc/apt/sources.list.d/lutris-team-lutris-jammy.list

# Sourced from https://repo.hamonikr.org/hamonikr-pkg.key
if [ ! -f $HAMONIKR_TRUSTED_PART ]; then
    echo "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.7 (GNU/Linux)
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
=jMj1
-----END PGP PUBLIC KEY BLOCK-----
" | gpg --dearmor > $HAMONIKR_TRUSTED_PART

fi

print_status 'Running `apt-get update` for you...'
exec_cmd 'apt-get update'

}

# 현재 APT 저장소 설정 백업
do_backup() {
    echo 'Prepare backup file for rollback...'
    for file in /etc/apt/sources.list.d/*.list; do
        if [ -f "$file" ]; then
            cp -v "$file" "${file}.bak"
            rm -v "$file"
        fi
    done
}


# 스크립트 중단 시 롤백
do_rollback() {
    echo 'The program has been interrupted. Roll back files...'
    for file in /etc/apt/sources.list.d/*.bak; do
        if [ -f "$file" ]; then
            original_file="${file%.bak}"
            cp -v "$file" "$original_file"
            rm -v "$file"
        fi
    done
    exec_cmd 'apt-get update'
}

# 업그레이드 전 삭제
do_remove() {
	exec_cmd 'touch /tmp/kumkang-upgrade.start'
	exec_cmd 'dpkg --configure -a'
	exec_cmd 'apt-get install -f'
	exec_cmd 'apt-get update'
	exec_cmd 'apt-get upgrade -y'

    # 삭제할 패키지 명을 배열로 저장
    packages=("hamonikrreport" "hamonikrwelcome" "warpinator" "rabbitvcs-core" "hamonikr-nemo-rabbitvcs" "lupin-casper")

    # 각 패키지에 대해 확인 후 purge 실행
    for pkg in "${packages[@]}"; do
    if dpkg -l | grep -q "$pkg"; then
        print_status "패키지 $pkg 를 제거합니다."
        apt-get purge -y "$pkg"
    fi
    done    
}

apt_check() {
    exec_cmd 'apt-get update'
	exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get -y --assume-yes  --option Dpkg::Options::=--force-confnew --allow-remove-essential --allow-change-held-packages install -f'
    exec_cmd 'dpkg --configure -a'    
}

# 업그레이드
do_upgrade() {
	apt_check
    
	exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get --assume-yes  --option Dpkg::Options::=--force-confnew install -y hamonikr-kumkang-apps'
    exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get --assume-yes  --option Dpkg::Options::=--force-confnew install -y plymouth-theme-kumkang'

	exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get --assume-yes  --option Dpkg::Options::=--force-confnew  upgrade -y'

	exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get -y --assume-yes  --option Dpkg::Options::=--force-confnew --allow-remove-essential --allow-change-held-packages dist-upgrade'
    
    apt_check
	
    exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get --assume-yes  --option Dpkg::Options::=--force-confnew install -y libwacom-common=2.2.0-1'
	exec_cmd 'DEBIAN_FRONTEND=noninteractive sudo apt-get --assume-yes  --option Dpkg::Options::=--force-confold install -y imagemagick-6-common=8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3'    
    
    apt_check
}

# 사용자 환경 초기화
do_clean() {
    dpkg --configure -a
    # apt-get autoremove -y
    update-initramfs -k all -u
    apt-get clean
    rm -f /var/lib/apt/lists/*_Packages
    rm -f /var/lib/apt/lists/*_Sources
    rm -f /var/lib/apt/lists/*_Translation-*
    rm -rf /tmp/* ~/.bash_history /home/.zshrc
    rm -fv /var/lib/dbus/machine-id
    rm -fv /sbin/initctl
    echo -n | sudo tee /etc/machine-id
    dpkg-divert --rename --remove /sbin/initctl
}

trap do_rollback SIGINT SIGTERM EXIT INT TERM

# do_upgrade process
# 0) backup current apt info
# 1) update, upgrade and remove packages
# 2) change new apt
# 3) install new packages

if [[ ! -f "/etc/hamonikr/info" ]]; then
    print_bold 'Check your OS. Program support Only HamoniKR OS'
    exit 1
else
    source "/etc/hamonikr/info"
    if [ "X${CODENAME}" != "Xtaebaek" ]; then
        print_bold "Your OS codename ${CODENAME} is not support."
        exit 1
    fi
    
    do_backup
    do_remove
    setup
    do_upgrade
    do_clean

	print_bold "Upgrade finished to HamoniKR 7.0. Reboot your system..."
	exec_cmd 'rm -f /tmp/kumkang-upgrade.start'    

fi
