<& /Elements/Header, Title => $title &>
<& /Elements/Tabs &>

<& /Elements/ListActions, actions => \@results &>

<form hx-boost="false" name="SwitchUsers" method="POST" action="<% RT->Config->Get('WebPath') %>/Tools/SwitchUsers.html">
    <div class="row mt-2 justify-content-center">
      <div class="col-auto">
        <select name="SwitchUser" class="selectpicker form-select">
% for my $user ( @users )  {
          <option <% $user->id == $session{'CurrentUser'}->id ? q{selected="selected"} : '' |n %> value="<% $user->id %>">
            <% $user->Name %>
% if ( $user->id == $users[0]->id ) {
            (<% loc('Base User') %>)
% }

% if ( $user->id == $session{'CurrentUser'}->id ) {
            (<% loc('Current User') %>)
% }
          </option>
% }
        </select>
      </div>
      <div class="col-auto">
        <& /Elements/Submit, Label => loc("Switch")&>
      </div>
    </div>
</form>

<%INIT>
my $title = loc( 'Switch Users' );
my @results;

my @users = RT::Extension::SwitchUsers->GetUsersToSwitch();
Abort( loc("Permission Denied") ) unless @users;

if ( $SwitchUser ) {
    if ( $SwitchUser =~ /^\d+$/ && grep { $SwitchUser == $_->id } @users ) {
        if ( $SwitchUser == $session{CurrentUser}->id ) {
            push @results, loc( "Current user is already '[_1]'", $session{CurrentUser}->Name );
        }
        else {
            my $previous_user_name = $session{CurrentUser}->Name;
            my $external_authed = $session{WebExternallyAuthed};
            RT::Interface::Web::InstantiateNewSession();
            $session{CurrentUser} = RT::CurrentUser->new;
            $session{CurrentUser}->Load( $SwitchUser );
            RT::Interface::Web::Session::Set(
                Key   => 'CurrentUser',
                Value => $session{'CurrentUser'},
            );

            if ( !$session{WebExternallyAuthed} ) {
                $session{WebExternallyAuthed} = $external_authed;
                RT::Interface::Web::Session::Set(
                    Key   => 'WebExternallyAuthed',
                    Value => $session{WebExternallyAuthed},
                );
            }
            my $current_user_name = $session{CurrentUser}->Name;

            # $users[0] is always the base user.
            if ( $session{CurrentUser}->id == $users[0]->id ) {
                RT->Logger->warning("Switched user back to $current_user_name from $previous_user_name");
            }
            else {
                RT->Logger->warning("Switched user from $previous_user_name to $current_user_name");
                $session{'SwitchUsers-BaseUser'} = $users[0]->id;
                RT::Interface::Web::Session::Set(
                    Key   => 'SwitchUsers-BaseUser',
                    Value => $session{'SwitchUsers-BaseUser'},
                );
            }
            push @results, loc( "Switched to user '[_1]'", $current_user_name );
        }
    }
    else {
        push @results, loc( "Invalid SwitchUser" );
    }
    MaybeRedirectForResults( Actions => \@results );
}

</%INIT>

<%ARGS>
$SwitchUser => undef
</%ARGS>