<& /Elements/Header, Title => $title &>
<& /Elements/Tabs &>
<& /Elements/ListActions, actions => \@results &>

<form method="post" id="automatic-assignment" class="automatic-assignment mx-auto max-width-md" action="AutomaticAssignment.html">
<input type="hidden" class="hidden" name="id" value="<%$QueueObj->Id%>" />

<div class="filters">

<h3><&|/l&>Filters</&></h3>

<p><i><&|/l&>Filters reduce the pool of eligible owners. Each user must fulfill the requirements of all the filters below to be included in this queue's automatic assignment.</&></i></p>

<select name="FilterType" class="selectpicker">
<option value="">-</option>

% for my $filter (@filters) {
% my $class = "RT::Extension::AutomaticAssignment::Filter::$filter";
% if ( RT::Handle::cmp_version($RT::VERSION, '5.0.4') >= 0 ) {
%     my ($ok, $msg) = RT::StaticUtil::RequireModule( $class );
%     unless ( $ok ) {
%         RT->Logger->error("Couldn't load class '$class': $msg");
%         $m->abort;
%     }
% } else {
%     unless ($class->require) {
%         RT->Logger->error("Couldn't load class '$class': $@");
%         $m->abort;
%     }
% }
<option value="<% $filter %>"><% $class->Description %></option>
% }

</select>

<& /Elements/Submit, Name => 'AddFilter', Label => loc('Add Filter'), FullWidth => 1 &>

<span class="loading"><&|/l&>Loading...</&></span>

<div class="filter-list destination">
<ul>
% my $i = 0;
% my $filters_value = "";
% for my $filter (@{ $config->{filters} }) {
%    ++$i;
%    my $name = $filter->{_name};
%    my $path = "/Admin/Queues/Elements/Filter/$name";
%    my $prefix = "Filter_${name}_$i";
%    $filters_value .= "$prefix,";

%    $m->comp($path, prefix => $prefix, config => $filter, queue => $QueueObj);
% }

<p class="rt-drop-placeholder m-1 p-2 border rounded"><&|/l&>Place here</&></p>
</ul>
</div>

<input type="hidden" class="hidden" name="Filters" value="<% $filters_value %>" />

</div>

<hr />

<div class="chooser">

<h3><&|/l&>Chooser</&></h3>

<p><i><&|/l&>A chooser selects a single owner from the filtered set of eligible users.</&></i></p>

% my $chooser_config = $config->{chooser};
% my $name = $ChooserType // $chooser_config->{_name};
% my $prefix = "Chooser_${name}";

<select name="ChooserType"
        class="selectpicker"
        hx-trigger="change"
        hx-post="AutomaticAssignment.html"
        hx-swap="innerHTML"
        hx-target="#chooser-details"
        hx-select="#chooser-details">

% for my $chooser (@choosers) {
% my $class = "RT::Extension::AutomaticAssignment::Chooser::$chooser";
% if ( RT::Handle::cmp_version($RT::VERSION, '5.0.4') >= 0 ) {
%     my ($ok, $msg) = RT::StaticUtil::RequireModule( $class );
%     unless ( $ok ) {
%         RT->Logger->error("Couldn't load class '$class': $msg");
%         $m->abort;
%     }
% } else {
%     unless ($class->require) {
%         RT->Logger->error("Couldn't load class '$class': $@");
%         $m->abort;
%     }
% }
<option <% $name eq $chooser ? "selected" : "" %> value="<% $chooser %>"><% $class->Description %></option>
% }

</select>

<span class="loading">Loading...</span>

<div id="chooser-details">
% my $path = "/Admin/Queues/Elements/Chooser/$name";
% $m->comp($path, prefix => $prefix, config => $chooser_config, queue => $QueueObj);

<input type="hidden" class="hidden" name="Chooser" value="<% $prefix %>" />
</div>

</div>

<div class="row mt-2">
  <div class="col-12">
    <& /Elements/Submit, Name => 'Update', Label => loc('Save Changes') &>
  </div>
</div>

</form>

<%INIT>
my @results;

my $QueueObj = RT::Queue->new($session{'CurrentUser'});
$QueueObj->Load($id) || Abort(loc("Couldn't load queue", $id));

my $title = loc('Automatic Assignment for queue [_1]', $QueueObj->Name);

my @filters = RT->Config->Get('AutomaticAssignmentFilters');
my @choosers = RT->Config->Get('AutomaticAssignmentChoosers');

if ($Update) {
    my @filters_config;
    my %chooser_config;

    for my $filter_prefix (split /,/, $Filters) {
        my @config_keys = grep { s/^\Q$filter_prefix\E_// ? $_ : () } keys %ARGS;
        my %filter_config = map { $_ => $ARGS{"${filter_prefix}_$_"} } @config_keys;
        push @filters_config, \%filter_config;
    }

    {
        my @config_keys = grep { s/^\Q$Chooser\E_// ? $_ : () } keys %ARGS;
        %chooser_config = map { $_ => $ARGS{"${Chooser}_$_"} } @config_keys;
    }

    my ($ok, $msg) = RT::Extension::AutomaticAssignment->_SetConfigForQueue(
        $QueueObj,
        \@filters_config,
        \%chooser_config,
    );

    if ($ok) {
        push @results, 'Automatic assignment updated';
    }
    else {
        push @results, $msg;
    }
}

my $attr = $QueueObj->FirstAttribute('AutomaticAssignment');
my $config = $attr ? $attr->Content : {
    filters => [],
    chooser => { _name => $choosers[0] },
};

my $scrips = RT::Extension::AutomaticAssignment->_ScripsForQueue($QueueObj);
if ($scrips->Count == 0) {
    push @results, loc("No scrips for automatic assignment are applied to this queue. Please see the AutomaticAssignment documentation for setup instructions.");
}
</%INIT>
<%ARGS>
$id => undef
$Update => undef
$Filters => undef
$Chooser => undef
$ChooserType => undef
</%ARGS>