
sub get_cf {
    my $name = shift;
    my $obj = RT::CustomField->new( $RT::SystemUser );
    $obj->Load( $name );
    unless ( $obj->id ) {
        print STDERR "Error: Couldn't load custom field '$name'\n";
        return undef;
    }
    return $obj;
}

sub apply_cf_to_queues {
    my ($name, @queues) = @_;
    my $cf = get_cf( $name ) or return;
    foreach my $queue( @queues ) {
        my $obj = RT::Queue->new( $RT::SystemUser );
        $obj->Load( $queue );
        unless ( $obj->id ) {
            print STDERR "Error: Couldn't load queue '$queue'\n";
            next;
        }
        my $OCF = RT::ObjectCustomField->new( $RT::SystemUser );
        my ($id, $msg) = $OCF->Create(
            CustomField => $cf->Id,
            ObjectId    => $obj->Id,
        );
        unless ( $id ) {
            print STDERR "Couldn't apply CF to '$queue'. Error: $msg\n";
            next;
        }
        print "Applied CF '$name' to queue '$queue'\n";
    }
}

sub set_cf_max_values {
    my ($name, $max) = @_;
    my $cf = get_cf( $name ) or return;
    my ($status, $msg) = $cf->SetMaxValues( $max );
    unless ( $status ) {
        print STDERR "Couldn't set CF's MaxValues property. Error: $msg\n";
        return;
    }
    unless ( $max ) {
        print "Changed type of the '$name' CF to multiple\n";
    }
    elsif ( $max == 1 ) {
        print "Changed type of the '$name' CF to single\n";
    }
    else {
        print "Limitted number of values of the '$name' CF to $max values\n";
    }
}

sub set_cf_field {
    my ($name, $field, $value) = @_;
    my $cf = get_cf( $name ) or return;
    my $method = 'Set'. $field;
    my ($status, $msg) = $cf->$method( $value );
    unless ( $status ) {
        print STDERR "Couldn't set CF's $field property. Error: $msg\n";
        return;
    } else {
        print "Changed $field for the custom field $name to '$value'\n";
    }
}

@Initial = (
    sub { apply_cf_to_queues( '_RTIR_IP', 'Incidents', 'Incident Reports', 'Investigations' ) },
    sub { set_cf_max_values( '_RTIR_IP', 0 ) },
    sub { set_cf_field( '_RTIR_IP', 'Description', 'IP address for RTIR queues' ) },

    sub { apply_cf_to_queues( '_RTIR_Constituency', 'Incident Reports', 'Investigations', 'Blocks' ) },
    sub { set_cf_field( '_RTIR_Constituency', 'Description', 'Constituency for RTIR queues' ) },
);

@Groups = (
    { Name        => 'DutyTeam EDUNET',
      Type        => 'Privileged',
      Domain      => 'UserDefined',
      Instance    => '',
      Description => 'Duty Team responsible for EDUNET constituency',    # loc
    },
    { Name        => 'DutyTeam GOVNET',
      Type        => 'Privileged',
      Domain      => 'UserDefined',
      Instance    => '',
      Description => 'Duty Team responsible for GOVNET constituency',    # loc
    },
);

@ScripActions = (
    {  Name        => 'RTIR parse message for IPs',    # loc
       Description => 'Set IP custom field from message content' ,                                            # loc
       ExecModule  => 'RTIR_FindIP',
    },
    {  Name        => 'RTIR Set Constituency',    # loc
       Description => 'Set and cascade Constituency custom field' ,                                            # loc
       ExecModule  => 'RTIR_SetConstituency',
    },
    {  Name        => 'RTIR Set Constituency Group',    # loc
       Description => 'Set group responsible for constituency' ,                                            # loc
       ExecModule  => 'RTIR_SetConstituencyGroup',
    },
);

@ScripConditions = (
    {  Name        => 'RTIR Require Constituency Change',    # loc
       Description => 'The constituency must be changed',                                            # loc
       ApplicableTransTypes => 'Any',
       ExecModule => 'RTIR_RequireConstituencyChange',
    },
    {  Name        => 'RTIR Require Constituency Group Change',    # loc
       Description => 'A group responsible for constituency must be changed',                                            # loc
       ApplicableTransTypes => 'Any',
       ExecModule => 'RTIR_RequireConstituencyGroupChange',
    },

);
@Scrips = (
    {  Description       => "SetIPFromContent",
       Queue             => ['Incidents', 'Incident Reports', 'Investigations', 'Blocks'],
       ScripCondition    => 'On Correspond',
       ScripAction       => 'RTIR parse message for IPs',
       Template          => 'Blank' },
    {  Description       => "SetIPFromContent",
       Queue             => ['Incidents', 'Incident Reports', 'Investigations', 'Blocks'],
       ScripCondition    => 'On Create',
       ScripAction       => 'RTIR parse message for IPs',
       Template          => 'Blank' },

    {  Description       => "SetConstituency",
       Queue             => ['Incidents', 'Incident Reports', 'Investigations', 'Blocks'],
       ScripCondition    => 'RTIR Require Constituency Change',
       ScripAction       => 'RTIR Set Constituency',
       Template          => 'Blank' },
    {  Description       => "SetConstituencyGroup",
       Queue             => ['Incidents', 'Incident Reports', 'Investigations', 'Blocks'],
       ScripCondition    => 'RTIR Require Constituency Group Change',
       ScripAction       => 'RTIR Set Constituency Group',
       Template          => 'Blank' },
);
