#!/usr/bin/env bash
# shellcheck disable=SC2120,SC1091,SC2181

# Setting up some colors for helping read the demo output.
# Comment out any of the below to turn off that color.
bold=$(tput bold)
cyan=$(tput setaf 6)
reset=$(tput sgr0)
export qm_quadlet=/etc/containers/systemd/qm.container
export rootfs=/usr/lib/qm/rootfs

read_color() {
    echo -e "\n\n[Press enter to continue]"
    read -r -p "${bold}$1${reset}"
}

exec_color() {
    echo -e "\nCommand to be executed:"
    echo -e "
\t${bold}$ $1${reset}\n"
    read -rp "[Press enter to continue]"
    eval "${1}"
    if [ "$?" -ne 0 ]; then
	    echo "command has failed ${1}"
	    exit 1
    fi

}

echo_color() {
    echo "${cyan}$1${reset}"
}

check_command() {
    required_cmds=(sudo podman dnf)
    for required_cmd in "${required_cmds[@]}"; do
        if ! command -v "${required_cmd}" &> /dev/null
        then
            echo "${1} command could not be found. Install ${1} to continue."
            exit 1
        fi
    done
}

init() {
    clear
    check_command

    if [ ! -f "./asilservice" ]; then
        echo "The asilservice script not found, please check."
	exit 1
    fi

    echo_color "Starting demo..."
    echo -e "  - Removing any previous configuration for qm...\n"
    rpm -e qm &> /dev/null
    sudo systemctl stop qm &> /dev/null
    sudo podman rm qm --force -t 0 > /dev/null
    sudo podman volume rm --force qmEtc qmVar > /dev/null
    sudo podman --root /var/lib/shared rmi -i ubi9 > /dev/null
    sudo rm -rf /usr/lib/qm > /dev/null
    test -s ${qm_quadlet}.orig && sudo mv ${qm_quadlet}.orig ${qm_quadlet}
}

install() {
    clear
    bluechi_snapshot='dnf copr enable @centos-automotive-sig/bluechi-snapshot -y &> /dev/null'
    eval "${bluechi_snapshot}"
    if [ "$?" -ne 0 ]; then
        echo "fail to enable copr."
    fi

    cmd_install='sudo dnf -y install qm \
			bluechi bluechi-agent bluechi-ctl \
			podman container-selinux; \
			sudo dnf -y update qm bluechi bluechi-agent \
			bluechi-ctl podman container-selinux'

    echo_color "Installing packages"
    eval "${cmd_install}"
    if [ "$?" -ne 0 ]; then
        echo "fail to install packages."
    fi
    clear
}

setup() {
    echo_color "Executing setup"
    echo_color "Staring and enabling bluechi on the host system"
    echo_color "============================================="
    exec_color "sudo systemctl start bluechi bluechi-agent"

    echo

    echo_color "Install and setup: /usr/lib/qm/rootfs"
    echo_color "============================================="
    exec_color "sudo /usr/share/qm/setup"
    read -rp "[Press enter to continue]"
    clear
}

status() {
    exec_color "sudo systemctl status qm.service"
    clear
}

cpuweight() {
    exec_color "sudo systemctl set-property --runtime qm.service CPUWeight=50"

    echo "Value stored in qm.service/cpu.weight:"
    sudo cat /sys/fs/cgroup/qm.service/cpu.weight

    exec_color "sudo systemctl set-property --runtime qm.service CPUWeight=10"

    echo "Value stored in qm.service/cpu.weight:"
    sudo cat /sys/fs/cgroup/qm.service/cpu.weight
    echo -e "\n\n[Press enter to continue]"
    read -r
}

podman_ctr() {
    clear
    exec_color "sudo podman exec -ti qm ps -eZ"
    exec_color "sudo podman exec qm podman run alpine echo hi"
    exec_color "sudo podman run ubi9 echo hi"
    exec_color "sudo podman exec qm podman images"
    exec_color "sudo podman images"
    exec_color "sudo podman exec qm podman run --userns=auto alpine cat /proc/self/uid_map"
    exec_color "sudo podman exec qm podman run --userns=auto alpine cat /proc/self/uid_map"
    exec_color "sudo podman exec qm podman run --userns=auto alpine cat /proc/self/uid_map"
    exec_color "sudo podman run --userns=auto ubi9 cat /proc/self/uid_map"
    exec_color "sudo podman run --userns=auto ubi9 cat /proc/self/uid_map"
}

bluechi() {
    clear
    exec_color "sudo podman exec -ti qm podman pull registry.access.redhat.com/ubi8/httpd-24:latest"
    exec_color "echo \"[Container]
Image=registry.access.redhat.com/ubi8/httpd-24
Network=host
\" > /tmp/myquadlet.container"

    exec_color "sudo podman cp /tmp/myquadlet.container qm:/etc/containers/systemd/"
    exec_color "sudo podman exec qm systemctl daemon-reload"

    # read the actual configuration.. and add the new qm.control
    source /etc/bluechi/bluechi.conf

    # Append to the current configuration the new node and restart the service
    sudo sed -i '/^AllowedNodeNames=/ s/$/,qm.control/' /etc/bluechi/bluechi.conf
    exec_color "sudo systemctl restart bluechi"

    # get the ip of controller via interface eth0
    ip_controller=$(ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1)
    eval "$(podman exec qm \
		sed -i 's/^#ControllerHost=/ControllerHost='"${ip_controller}"'/g' \
		/etc/bluechi/agent.conf
    )"
    eval "$(podman exec qm \
                systemctl restart bluechi-agent
    )"

    exec_color "sudo bluechictl restart qm.control myquadlet.service"
    exec_color "sudo bluechictl list-units | grep --color myquadlet"

    # give time to server spin up
    sleep 3

    exec_color "curl 127.0.0.1:8080"
    exec_color "sudo bluechictl stop qm.control myquadlet.service"

    # requires true as return -1 (to show that myquadlet is gonet)
    exec_color "sudo bluechictl list-units | grep --color myquadlet || true"
}

additional_store() {
    test -s ${qm_quadlet}.orig || sudo cp ${qm_quadlet} ${qm_quadlet}.orig
    exec_color "sudo podman --root /var/lib/shared pull ubi9"
    exec_color "sudo podman --root /var/lib/shared images | grep -A 10 -B 10 --color ubi9"

    # requires true as return -1 (to show the image doesn't exist)
    exec_color "sudo podman exec qm podman images | grep -A 10 -B 10 --color ubi9 || true"

    exec_color  "sudo sed -i -e '\$aVolume=/var/lib/shared:/var/lib/shared:ro' /etc/containers/systemd/qm.container"
    exec_color "sudo systemctl daemon-reload"
    exec_color "sudo systemctl restart qm.service"
    exec_color "sudo podman exec qm podman images | grep -A 10 -B 10 --color ubi9"
}

asilservice() {
    # requires true as return -1 (to show that the asilservice is not available)
    exec_color "grep -A 20 -B 20 --color system_u.*s0 asilservice || true"

    exec_color "sudo mkdir -p /run/asilservice"
    exec_color "sudo python ./asilservice &"
    exec_color "sudo systemctl stop qm"
    sudo -u root "podman volume rm --force qmEtc qmVar > /dev/null"
    exec_color "sudo dnf -y install --installroot ${rootfs} nmap-ncat --nogpgcheck"
    exec_color "sudo restorecon -R ${rootfs}"
    exec_color  "sudo sed -i -e '\$aVolume=/run/asilservice:/run/asilservice' /etc/containers/systemd/qm.container"
    exec_color "sudo systemctl daemon-reload"
    exec_color "sudo systemctl restart qm"

    echo_color "Starting asilservice, type any command to get a reply from ASIL service or quit to exit."
    # requires true as return -1 as users type quit or goodbye
    exec_color "sudo podman exec -ti qm /usr/bin/nc -U /run/asilservice/asilservice.sock || true"
}

init

install

setup

status

cpuweight

podman_ctr

bluechi

additional_store

asilservice

echo "Demo is done"
