#!/bin/sh
set -eu

state_dir=/var/lib/catos-branding/backup
mkdir -p "$state_dir"

backup_path() {
    path=$1
    name=$2
    managed_target=$3
    legacy_target=$4
    fallback=$5
    managed_source=${6-}

    current_target=
    if [ -L "$path" ]; then
        current_target=$(readlink "$path")
        if [ "$current_target" = "$managed_target" ]; then
            return
        fi
    elif [ -n "$managed_source" ] && [ -f "$path" ] && cmp -s "$managed_source" "$path"; then
        return
    fi

    backup="$state_dir/$name"
    absent="$state_dir/$name.absent"

    if [ -n "$legacy_target" ] && [ "$current_target" = "$legacy_target" ]; then
        if [ -e "$backup" ] || [ -L "$backup" ] || [ -e "$absent" ]; then
            return
        fi
        case "$fallback" in
            issue)
                if [ -f /usr/share/factory/etc/issue ]; then
                    cp -a /usr/share/factory/etc/issue "$backup"
                else
                    : > "$absent"
                fi
                ;;
            lsb)
                cat > "$backup" <<'LSB_EOF'
DISTRIB_ID="Arch"
DISTRIB_RELEASE="rolling"
DISTRIB_DESCRIPTION="Arch Linux"
LSB_EOF
                ;;
            *)
                : > "$absent"
                ;;
        esac
        return
    fi

    rm -f "$backup" "$absent"
    if [ -e "$path" ] || [ -L "$path" ]; then
        cp -a --no-dereference "$path" "$backup"
    else
        : > "$absent"
    fi
}

replace_file() {
    source=$1
    path=$2
    temporary="$path.catos-branding.$$"

    if [ -d "$path" ] && [ ! -L "$path" ]; then
        echo "catos-branding: refusing to replace directory: $path" >&2
        exit 1
    fi

    rm -f "$temporary"
    if ! install -m 0644 "$source" "$temporary"; then
        rm -f "$temporary"
        exit 1
    fi
    if ! mv -f "$temporary" "$path"; then
        rm -f "$temporary"
        exit 1
    fi
}

replace_link() {
    target=$1
    path=$2
    if [ -d "$path" ] && [ ! -L "$path" ]; then
        echo "catos-branding: refusing to replace directory: $path" >&2
        exit 1
    fi
    rm -f "$path"
    ln -s "$target" "$path"
}

backup_path /usr/lib/os-release usr-lib-os-release catos-os-release "" none /usr/lib/catos-os-release
backup_path /etc/issue etc-issue ../usr/lib/catos-issue /etc/catos-issue issue
backup_path /etc/lsb-release etc-lsb-release ../usr/lib/catos-lsb-release /etc/catos-lsb-release lsb

replace_file /usr/lib/catos-os-release /usr/lib/os-release
replace_link ../usr/lib/os-release /etc/os-release
replace_link ../usr/lib/catos-issue /etc/issue
replace_link ../usr/lib/catos-lsb-release /etc/lsb-release

rm -f /etc/catos-os-release /etc/catos-issue /etc/catos-lsb-release
