use base "installedtest";
use strict;
use testapi;
use utils;

sub run {

    my $self = shift;
    $self->root_console(tty => 3);
    if (get_var("ARCH") eq "aarch64") {
        # this should stop audit messages screwing things up
        assert_script_run "rpm-ostree kargs --append=audit=0";
        script_run "systemctl reboot", 0;
        boot_to_login_screen;
        $self->root_console(tty => 3);
    }

    # list available branches
    my $subv = lc(get_var("SUBVARIANT"));
    my $remote = "fedora";
    $remote = "fedora-iot" if ($subv eq "iot");
    assert_script_run "ostree remote refs $remote";

    # get current branch
    my $current = script_output "rpm-ostree status -b | grep fedora";

    my $arch = lc(get_var("ARCH"));

    # decide target
    my $rebase;
    my $target;
    if ($current =~ "iot") {
        $rebase = $current =~ "stable" ? "devel" : "stable";
        $target = "fedora/${rebase}/${arch}/iot";
    }
    elsif ($current =~ "silverblue") {
        my $relnum = get_release_number;
        $rebase = $relnum - 1;
        # avoid rebasing from 37 to <37, bad stuff happens
        # FIXME when 38 branches, we should change this to RELNUM+1
        $rebase = "rawhide" if ($relnum eq "37");
        $target = "fedora/${rebase}/${arch}/silverblue";
    }
    elsif ($current =~ "coreos") {
        $rebase = $current =~ "stable" ? "testing" : "stable";
        $target = "fedora/${arch}/coreos/${rebase}";
    }

    # rebase to the chosen target
    validate_script_output "rpm-ostree rebase $target --bypass-driver", sub { m/systemctl reboot/ }, 300;
    script_run "systemctl reboot", 0;

    boot_to_login_screen;
    $self->root_console(tty => 3);

    # check booted branch to make sure successful rebase
    validate_script_output "rpm-ostree status -b", sub { m/$target/ }, 300;

    # rollback and reboot
    if (get_var("ADVISORY") eq "FEDORA-2023-f6afa6f9e5") {
        # FIXME: workaround for a very odd phenomenon with this update
        # https://bodhi.fedoraproject.org/updates/FEDORA-2023-f6afa6f9e5#comment-2919613
        # if that keeps happening after the update is stable we will
        # have to do this for all affected releases
        script_run "rpm-ostree rollback && systemctl reboot", 0;
        boot_to_login_screen(timeout => 450);
    }
    else {
        validate_script_output "rpm-ostree rollback", sub { m/systemctl reboot/ }, 300;
        script_run "systemctl reboot", 0;
        boot_to_login_screen;
    }
    $self->root_console(tty => 3);

    # check to make sure rollback successful
    validate_script_output "rpm-ostree status -b", sub { m/$current/ }, 300;
}

sub test_flags {
    return {fatal => 1};
}

1;

# vim: set sw=4 et: