%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2026 Best Practical Solutions, LLC
%#                                          <sales@bestpractical.com>
%#
%# (Except where explicitly superseded by other copyright notices)
%#
%#
%# LICENSE:
%#
%# This work is made available to you under the terms of Version 2 of
%# the GNU General Public License. A copy of that license should have
%# been provided with this software, but in any event can be snarfed
%# from www.gnu.org.
%#
%# This work is distributed in the hope that it will be useful, but
%# WITHOUT ANY WARRANTY; without even the implied warranty of
%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%# General Public License for more details.
%#
%# You should have received a copy of the GNU General Public License
%# along with this program; if not, write to the Free Software
%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%# 02110-1301 or visit their web page on the internet at
%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
%#
%#
%# CONTRIBUTION SUBMISSION POLICY:
%#
%# (The following paragraph is not intended to limit the rights granted
%# to you to modify and distribute this software under the terms of
%# the GNU General Public License and is only of importance to you if
%# you choose to contribute your changes and enhancements to the
%# community by submitting them to Best Practical Solutions, LLC.)
%#
%# By intentionally submitting any modifications, corrections or
%# derivatives to this work, or any other work intended for use with
%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
%# you are the copyright holder for those contributions and you grant
%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
%# royalty-free, perpetual, license to use, copy, create derivative
%# works based on those contributions, and sublicense and distribute
%# those contributions and any derivatives thereof.
%#
%# END BPS TAGGED BLOCK }}}
<%INIT>
my $QueueObj = RT::Queue->new( $session{CurrentUser} );
$QueueObj->Load( $ARGSRef->{Queue} );
return unless RT::IR->OurQueue( $QueueObj );

my $constituency = $m->{'RTIR_ConstituencyFilter'};

my $Type = RT::IR::TicketType( Lifecycle => $QueueObj->Lifecycle );

my @Incident = ref $ARGSRef->{Incident} ? @{ $ARGSRef->{Incident} } : ( $ARGSRef->{Incident} || () );

my @IncidentObj;
foreach my $id ( grep $_, @Incident ) {
    my $error = 1;

    my $inc = RT::Ticket->new( $session{'CurrentUser'} );
    $inc->Load( $id );
    unless ( $inc->id ) {
        push @$results, loc("Couldn't load incident #[_1]", $id );
    }
    elsif ( !RT::IR->IsIncidentQueue($inc->QueueObj) ) {
        push @$results, loc('Ticket #[_1] is not an Incident', $id );
    }
    else {
        my $incident_constituency = RT::IR->ConstituencyFor($inc);
        if ($constituency && $incident_constituency ne $constituency) {
            push @$results, loc("Incident constituency '[_1]' does not match current constituency '[_2]'", $incident_constituency, $constituency);
        }
        if(!$constituency) {
            $constituency = RT::IR->ConstituencyFor($inc);
        }
        push @IncidentObj, $inc;
        $error = 0;
    }
    $$checks_failure_ref += $error;
}

if ( $ARGSRef->{Child} ) {
    my $related_ticket = LoadTicket( $ARGSRef->{Child} );
    if ( $related_ticket->Id ) {
        my $related_constituency = RT::IR->ConstituencyFor($related_ticket);
        if ( $constituency && $constituency ne $related_constituency ) {
            push @$results,
                loc(
                "[_1] constituency '[_2]' does not match current constituency '[_3]'",
                RT::IR::TicketType( Ticket => $related_ticket ),
                $related_constituency, $constituency
                );
        }
    }
}

return unless grep { /SubmitTicket/ } keys %$ARGSRef;
my $children_config = RT->Config->Get('RTIR_IncidentChildren')->{ $Type };

unless ($$skip_create) {
    if ( RT::IR->IsInvestigationQueue($QueueObj) && !$ARGSRef->{'Requestors'} ) {
        push @$results, loc("You must enter a correspondent");
        $$checks_failure_ref = 1;
    }
    if ( $children_config->{'Required'} && !@IncidentObj ) {
        push @$results, loc("You must enter an Incident ID");
        $$checks_failure_ref = 1;
    }

    $$checks_failure_ref += RT::IR->FilterRTAddresses(
        ARGSRef => \%ARGS,
        Fields  => { Requestors => 'Requestor', Cc => 'Cc', AdminCc => 'AdminCc' },
        results => $results,
    );

    if ( $ARGSRef->{InvestigationSubmitTicket} ) {
        $$checks_failure_ref += RT::IR->FilterRTAddresses(
            ARGSRef => \%ARGS,
            Fields => {
                InvestigationRequestors => 'Requestor',
                InvestigationCc => 'Cc',
                InvestigationAdminCc => 'AdminCc',
            },
            results => $results,
        );

        if ( !$ARGSRef->{InvestigationRequestors} ) {
            push @$results, loc( "You must enter a correspondent for the investigation" );
            $$checks_failure_ref = 1;
        }
    }
}

unless ( $$skip_create || $$checks_failure_ref ) {
    $ARGSRef->{'new-MemberOf'} = join ' ', List::MoreUtils::uniq( $ARGSRef->{'new-MemberOf'} || (), @Incident );
    $ARGSRef->{'MemberOf-new'} = join ' ', List::MoreUtils::uniq( $ARGSRef->{'MemberOf-new'} || (), $ARGSRef->{Child} || () );
}

unshift @$results, loc("Creation failed:") if $$checks_failure_ref && @$results;
</%INIT>
<%ARGS>
$ARGSRef
$skip_create
$checks_failure_ref
$results
</%ARGS>
