# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: Copyright 2024 SUSE LLC
# SPDX-FileCopyrightText: Copyright 2024 Richard Brown
# SPDX-FileCopyrightText: Copyright 2025 Tobias Görgens

writemigdesktop() {
    prun-opt /usr/bin/tee "$1/.config/autostart/aeon-mig-firstboot.desktop" << "EOF"
[Desktop Entry]
Name=Aeon Migration FirstBoot Setup
Comment=Sets up Aeon Correctly On FirstBoot after Migration
Exec=/usr/bin/aeon-mig-firstboot
Icon=org.gnome.Terminal
Type=Application
Categories=Utility;System;
Name[en_GB]=startup
EOF
    prun-opt /usr/bin/chmod 666 "$1/.config/autostart/aeon-mig-firstboot.desktop"
}

if [ "${migrate}" == 1 ]; then
    tik_target_mount "" "required"

    [ -n "${TIK_ROOT_MNT}" ] || error "MIGRATION FAILED: TIK_ROOT_MNT not set"
    [ -n "${TIK_ROOT_DEV}" ] || error "MIGRATION FAILED: TIK_ROOT_DEV not set"

    tik_progress_step "Preparing migration restore" 0

    prun /usr/bin/mkdir -p "${TIK_ROOT_MNT}/mnt"

    tik_unmount "${TIK_ROOT_MNT}/home"
    tik_mount "${TIK_ROOT_DEV}" "mnt" "compress=zstd:1,subvol=/@"

    tik_progress_step "Applying target repart configuration" 10
    prun /usr/bin/systemd-repart --pretty 0 --root "${TIK_ROOT_MNT}" --dry-run=0 "${TIK_ROOT_DEV}"

    tik_progress_step "Restoring user/account data" 25
    prun /usr/bin/cat "${mig_dir}/passwd.out" | prun /usr/bin/tee -a "${TIK_ROOT_MNT}/etc/passwd"
    prun /usr/bin/cat "${mig_dir}/group.out"  | prun /usr/bin/tee -a "${TIK_ROOT_MNT}/etc/group"
    prun /usr/bin/cat "${mig_dir}/shadow.out" | prun /usr/bin/tee -a "${TIK_ROOT_MNT}/etc/shadow"
    prun /usr/bin/sed -i "/^wheel:/ s/$/$(head -n 1 "${mig_dir}/passwd.out" | awk -F'[/:]' '{print $1}')/" "${TIK_ROOT_MNT}/etc/group"
    prun /usr/bin/cp -a "${mig_dir}/subuid" "${TIK_ROOT_MNT}/etc/subuid"
    prun /usr/bin/cp -a "${mig_dir}/subgid" "${TIK_ROOT_MNT}/etc/subgid"
    # It's not guaranteed that the system will have existing network configs, localtime or AccountsService
    prun-opt /usr/bin/cp -a "${mig_dir}/system-connections/"* "${TIK_ROOT_MNT}/etc/NetworkManager/system-connections"
    prun-opt /usr/bin/cp -a "${mig_dir}/localtime" "${TIK_ROOT_MNT}/etc/localtime"
    prun-opt /usr/bin/cp -a "${mig_dir}/users/"* "${TIK_ROOT_MNT}/var/lib/AccountsService/users"
    prun-opt /usr/bin/cp -a "${mig_dir}/icons/"* "${TIK_ROOT_MNT}/var/lib/AccountsService/icons"
    prun-opt /usr/bin/cp -a "${mig_dir}/bluetooth/"* "${TIK_ROOT_MNT}/var/lib/bluetooth"
    prun-opt /usr/bin/cp -a "${mig_dir}/fprint/"* "${TIK_ROOT_MNT}/var/lib/fprint"
    prun-opt /usr/bin/cp -a "${mig_dir}/openvpn/"* "${TIK_ROOT_MNT}/etc/openvpn"

    log "[mig] deleting existing /home subvolume under ${TIK_ROOT_MNT}/mnt"
    tik_progress_step "Removing existing /home" 35
    prun /usr/sbin/btrfs subvolume delete "${TIK_ROOT_MNT}/mnt/home"

    tik_progress_step "Restoring /home" 55
    (prun /usr/sbin/btrfs send "${mig_dir}/${snap_dir}" | pv -f -F "# %b copied in %t %r" | prun /usr/sbin/btrfs receive "${TIK_ROOT_MNT}/mnt") 2>&1 >/dev/null

    prun /usr/bin/mv "${TIK_ROOT_MNT}/mnt/${snap_dir}" "${TIK_ROOT_MNT}/mnt/home"
    prun /usr/sbin/btrfs property set -f -ts "${TIK_ROOT_MNT}/mnt/home" ro false

    for subsubvol in $(prun-opt /usr/sbin/btrfs subvolume list -o "${mig_dir}/${snap_dir}" --sort=path | rev | cut -f1 -d' ' | rev | sed 's/^@//'); do
        subsubvolname="$(basename "$subsubvol")"
        subsubdirname="$(dirname "$subsubvol" | awk -F "${mig_dir}/${snap_dir}" '{print $2}')"

        tik_progress_step "Restoring containers" 70
        (prun /usr/sbin/btrfs send "${subsubvol}" | pv -f -F "# %b copied in %t %r" | prun /usr/sbin/btrfs receive "${TIK_ROOT_MNT}/mnt/home/${subsubdirname}") 2>&1 >/dev/null

        prun /usr/sbin/btrfs property set -f -ts "${TIK_ROOT_MNT}/mnt/home/${subsubdirname}/${subsubvolname}" ro false
        prun-opt /usr/bin/sed -i 's/driver = "overlay"/driver = "btrfs"/g' "${TIK_ROOT_MNT}/mnt/etc/containers/storage.conf"
    done
    tik_mount "${TIK_ROOT_DEV}" "home" "compress=zstd:1,subvol=/@/home"

    tik_progress_step "Writing firstboot autostart entries" 90
    for userhome in "${TIK_ROOT_MNT}/mnt/home"/*/; do
        writemigdesktop "${userhome}"
    done

    tik_unmount "${TIK_ROOT_MNT}/mnt"

    tik_progress_step "Migration restore complete" 100
fi
