sub get_queue {
    my $meta = shift;
    my $obj = RT::Queue->new( $RT::SystemUser );
    $obj->LoadByCols( ref $meta? %$meta: ( Name => $meta ) );
    unless( $obj->id ) {
        print STDERR "Couldn't load queue.";
        return;
    }
    return $obj;

}
sub get_scrip {
    my $meta = shift;
    $meta = { Description => $meta } unless ref $meta;

    if ( $meta->{'Queue'} && $meta->{'Queue'} !~ /^\d+$/ ) {
        my $queue = get_queue( $meta->{'Queue'} ) or return;
        $meta->{'Queue'} = $queue->id;
    }

    my $obj = RT::Scrip->new( $RT::SystemUser );
    $obj->LoadByCols( %$meta );
    unless( $obj->id ) {
        print STDERR "Couldn't load scrip.";
        return;
    }
    return $obj;
}

sub delete_scrip {
    my $obj = get_scrip( @_ ) or return;
    # Delete has no return value
    my ($status, $msg) = $obj->Delete;
    print "Deleted scrip #". $obj->id .": ". $obj->Description ."\n";
}

@Initial = ( sub {
    eval { require RT::FM; };
    if ($@) {
        die "RTIR is built on top of RTFM; please install RTFM before continuing.\n";
    }
}, sub {
    delete_scrip( { Description => 'NotifyOnLaunch', Queue => 'Investigations' } );
    delete_scrip( { Description => 'NotifyOnCreate', Queue => 'Blocks' } );

    
} );

@CustomFields = (
    {
        Name        => '_RTIR_Resolution',
        Description => 'Resolution for Incidents RTIR queue',
        Type        => 'SelectSingle',
        Disabled    => 0,
        Queue       => 'Incidents',
        Values      => [
            {   Name => 'successfully resolved',
                SortOrder => 1,
            },
            {   Name => 'no resolution reached',
                SortOrder => 2,
            },
            {   Name => 'no response from customer',
                SortOrder => 3,
            },
            {   Name => 'no response from other ISP',
                SortOrder => 4,
            },
        ],
    },
    {
        Name        => '_RTIR_Customer',
        Description => 'Customer for Incident Reports RTIR queue',
        Type        => 'SelectMultiple',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Values      => [ ],
    },
    {
        Name        => '_RTIR_Customer',
        Description => 'Customer for Investigations RTIR queue',
        Type        => 'SelectSingle',
        Queue       => 'Investigations',
        Disabled    => 0,
        Values      => [ ],
    },
);

# all CustomFields to update ACLs, Descriptions, Disabled and other fields
# XXX: this is copy from etc/initialdata
my @CustomFieldsList = (
    {
        Name        => '_RTIR_State',
        Type        => 'SelectSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'State for Incidents RTIR queue',
        Values      => [
            { Name      => "open",      SortOrder => 1 },
            { Name      => "resolved",  SortOrder => 2 },
            { Name      => "abandoned", SortOrder => 3 },
        ],
    },
    {
        Name        => '_RTIR_Constituency',
        Type        => 'SelectSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'Constituency for Incidents RTIR queue',
        Values      => [
            { Name      => "EDUNET", SortOrder => 1 },
            { Name      => "GOVNET", SortOrder => 2 },
        ],
    },
    {
        Name        => '_RTIR_State',
        Type        => 'SelectSingle',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Description => 'State for Incident Reports RTIR queue',
        Values      => [
            { Name      => "new",      SortOrder => 1 },
            { Name      => "open",     SortOrder => 2 },
            { Name      => "resolved", SortOrder => 3 },
            { Name      => "rejected", SortOrder => 4 },
        ],
    },
    {
        Name        => '_RTIR_State',
        Type        => 'SelectSingle',
        Queue       => 'Investigations',
        Disabled    => 0,
        Description => 'State for Investigations RTIR queue',
        Values      => [
            { Name      => "open",     SortOrder => 1 },
            { Name      => "resolved", SortOrder => 2 },
        ],
    },
    {
        Name        => '_RTIR_State',
        Type        => 'SelectSingle',
        Queue       => 'Blocks',
        Disabled    => 0,
        Description => 'State for Blocks RTIR queue',
        Values      => [
            { Name      => "pending activation", SortOrder => 1 },
            { Name      => "active", SortOrder => 2 },
            { Name      => "pending removal", SortOrder => 3 },
            { Name      => "removed", SortOrder => 4 }
        ],
    },
    {
        Name        => '_RTIR_Description',
        Type        => 'FreeformSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'Description for Incidents RTIR queue',
    },
    {
        Name        => '_RTIR_Resolution',
        Type        => 'SelectSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'Resolution for Incidents RTIR queue',
        Values      => [
            { Name => 'successfully resolved',      SortOrder => 1 },
            { Name => 'no resolution reached',      SortOrder => 2 },
            { Name => 'no response from customer',  SortOrder => 3 },
            { Name => 'no response from other ISP', SortOrder => 4 },
        ],
    },
    {
        Name        => '_RTIR_SLA',
        Type        => 'SelectSingle',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Description => 'SLA for Incident Reports RTIR queue',
        Values      => [
            { Name => 'Full service',               SortOrder => 1 },
            { Name => 'Full service: out of hours', SortOrder => 2 },
            { Name => 'Reduced service',            SortOrder => 3 },
        ],
    },
    {
        Name        => '_RTIR_Function',
        Type        => 'SelectSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'Function for Incidents RTIR queue',
        Values      => [
            { Name      => "AbuseDesk",     SortOrder => 1 },
            { Name      => "IncidentCoord", SortOrder => 2 },
        ],
    },
    {
        Name        => '_RTIR_Classification',
        Type        => 'SelectSingle',
        Queue       => 'Incidents',
        Disabled    => 0,
        Description => 'Classification for Incidents RTIR queue',
        Values      => [
            { Name      => "Spam",              SortOrder => 1 },
            { Name      => "System Compromise", SortOrder => 2 },
            { Name      => "Query",             SortOrder => 3 },
            { Name      => "Scan",              SortOrder => 4 },
            { Name      => "Denial of Service", SortOrder => 5 },
            { Name      => "Piracy",            SortOrder => 6 },
        ],
    },
    {
        Name        => '_RTIR_HowReported',
        Type        => 'SelectSingle',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Description => 'How the incident was reported for Incident Reports RTIR queue',
        Values => [
            { Name      => "Email",      SortOrder => 1 },
            { Name      => "Telephone", SortOrder => 2 },
            { Name      => "Other",     SortOrder => 3 },
        ]
    },
    {
        Name        => '_RTIR_ReporterType',
        Type        => 'SelectSingle',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Description => 'Reporter type for Incident Reports RTIR queue',
        Values      => [
            { Name => "customer",            SortOrder => 1 },
            { Name => "external individual", SortOrder => 2 },
            { Name => "other ISP",           SortOrder => 3 },
            { Name => "police",              SortOrder => 4 },
            { Name => "other IRT",           SortOrder => 5 },
            { Name => "other",               SortOrder => 6 },
        ]
    },
    {
        Name        => '_RTIR_IP',
        Type        => 'FreeformSingle',
        Queue       => 'Blocks',
        Disabled    => 0,
        Description => 'IP address for Blocks RTIR queue',
    },
    {
        Name        => '_RTIR_Netmask',
        Type        => 'FreeformSingle',
        Queue       => 'Blocks',
        Disabled    => 0,
        Description => 'Network mask for Blocks RTIR queue',
    },
    {
        Name        => '_RTIR_Port',
        Type        => 'FreeformSingle',
        Queue       => 'Blocks',
        Disabled    => 0,
        Description => 'Port for Blocks RTIR queue',
    },
    {
        Name        => '_RTIR_WhereBlocked',
        Type        => 'FreeformSingle',
        Queue       => 'Blocks',
        Disabled    => 0,
        Description => 'Where the block is placed for Blocks RTIR queue',
    },
    {
        Name        => '_RTIR_Customer',
        Type        => 'SelectMultiple',
        Queue       => 'Incident Reports',
        Disabled    => 0,
        Values      => [ ],
        Description => 'Customer for Incident Reports RTIR queue',
    },
    {
        Name        => '_RTIR_Customer',
        Type        => 'SelectSingle',
        Queue       => 'Investigations',
        Disabled    => 0,
        Values      => [ ],
        Description => 'Customer for Investigations RTIR queue',
    },
);

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

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 ". $cf->Name ." to '$value'\n";
    }
}

for my $cf (@CustomFieldsList) {
    push @ACL, (
        { GroupId     => 'DutyTeam',
          GroupDomain => 'UserDefined',
          CF          => $cf->{'Name'},
          Queue       => $cf->{'Queue'},
          Right       => 'SeeCustomField',
        },
        { GroupId     => 'DutyTeam',
          GroupDomain => 'UserDefined',
          CF          => $cf->{'Name'},
          Queue       => $cf->{'Queue'},
          Right       => 'ModifyCustomField',
        },
    );

    # skip new CFs
    next if $cf->{'Name'} =~ /^_RTIR_(Resolution|Customer)$/i;

    set_cf_field( $cf, 'Description', $cf->{'Description'} );
    # next step is done with schema update
    # set_cf_field( $cf, 'Disabled', $cf->{'Disabled'} );
}

@Templates = (
    { Queue       => 'Blocks',
      Name        => 'Autoreply',
      Description => 'Sent when a block is created',
      Content     => 'RT-Attach-Message: yes
Subject: { $Ticket->Subject }

{ $Transaction->Content }

{ my $output = "";
  my @mailfields = qw(
      _RTIR_IP
      _RTIR_Netmask
      _RTIR_Port
      _RTIR_WhereBlocked
  );

  my $CustomFields = $Ticket->QueueObj->TicketCustomFields;
  while ( my $CustomField = $CustomFields->Next ) {
    my $name = $CustomField->Name;
    next unless grep $_ eq $name, @mailfields;

    my $Values = $Ticket->CustomFieldValues( $CustomField->Id );
    while ( my $Value = $Values->Next ) {
      $name =~ /^_RTIR_(.*)/;
      $output .= ($1 || $name) .": "
              .  $Value->Content ."\n";
    }
  }
  return $output;
}
-------------------------------------------------------------------------
Please include the string:

         [{ $rtname } #{ $Ticket->id }]

in the subject line of all future correspondence about this issue. To do so, 
you may reply to this message.

                        Thank you,
                        { $Ticket->QueueObj->CorrespondAddress }', },
    { Queue       => 'Blocks',
      Name        => 'BlockRemoved',
      Description => 'Sent when a block is removed',
      Content     => 'Subject: {$Ticket->Subject}

Block #{$Ticket->id} was removed.

{
  my $output = "";
  my $CustomFields = $Ticket->QueueObj->CustomFields();
  $CustomFields->{"find_disabled_rows"} = 1;
  while (my $CustomField = $CustomFields->Next()) {
    my @mailfields = ("_RTIR_IP", 
        "_RTIR_Netmask", 
        "_RTIR_Port",
        "_RTIR_WhereBlocked");
    my $Values = $Ticket->CustomFieldValues($CustomField->Id);
    while (my $Value = $Values->Next()) {
      for my $field (@mailfields) {
        if ($CustomField->Name eq $field) {
          $output .= $CustomField->Name.": ".$Value->Content."\n";
        }
      }
    }
  }
  return $output;
}
-------------------------------------------------------------------------
Please include the string:

         [{$rtname} #{$Ticket->id}]

in the subject line of all future correspondence about this issue. To do so, 
you may reply to this message.

                        Thank you,
                        {$Ticket->QueueObj->CorrespondAddress()}', },
);

@ScripActions = (
    {  Name        => 'RTIR Set Incident Resolution',    # loc
       Description => 'Set the default resolution of an Incident' ,                                            # loc
       ExecModule => 'RTIR_SetIncidentResolution',
    },
);

@Scrips = (
    {  Description       => "SetStartsDateOnQueueChange",
       Queue             => 'Incidents',
       ScripCondition    => 'On Queue Change',
       ScripAction       => 'RTIR Set Starts to Now',
       Template          => 'Blank' },
    {  Description       => "SetStartsDateOnQueueChange",
       Queue             => [ 'Incident Reports', 'Investigations', 'Blocks' ],
       ScripCondition    => 'On Queue Change',
       ScripAction       => 'RTIR Set Starts by Business Hours',
       Template          => 'Blank' },

    {  Description       => "SetDueOnQueueChange",
       Queue             => 'Incident Reports',
       ScripCondition    => 'On Queue Change',
       ScripAction       => 'RTIR Set Due by SLA',
       Template          => 'Blank' },
    {  Description       => "SetDueOnQueueChange",
       Queue             => [ 'Investigations', 'Blocks' ],
       ScripCondition    => 'On Queue Change',
       ScripAction       => 'RTIR Set Due Correspond',
       Template          => 'Blank' },

    {  Description       => "SetDefaultIncidentResolution",
       Queue             => 'Incidents',
       ScripCondition    => 'On Status Change',
       ScripAction       => 'RTIR Set Incident Resolution',
       Template          => 'Blank', },

    {  Description       => "NotifyOnClose",
       Queue             => 'Blocks',
       ScripCondition    => 'RTIR Close Ticket',
       ScripAction       => 'Notify Requestors',
       Template          => 'BlockRemoved' },
);

push @ACL, (
    { GroupId     => 'DutyTeam',
      GroupDomain => 'UserDefined',
      Queue       => 0,
      Right       => 'ModifySelf',
    },
    { GroupId     => 'DutyTeam',
      GroupDomain => 'UserDefined',
      Queue       => 0,
      Right       => 'ShowSavedSearches',
    },
    { GroupId     => 'DutyTeam',
      GroupDomain => 'UserDefined',
      Queue       => 0,
      Right       => 'LoadSavedSearch',
    },
    { GroupId     => 'DutyTeam',
      GroupDomain => 'UserDefined',
      Queue       => 0,
      Right       => 'EditSavedSearches',
    },
    { GroupId     => 'DutyTeam',
      GroupDomain => 'UserDefined',
      Queue       => 0,
      Right       => 'CreateSavedSearch',
    },
);

@Attributes = ( {
    Name => 'RTIR_HomepageSettings',
    Description => 'RTIR homepage settings',
    Content => {
        body => [
            { type => 'component',  name => '/RTIR/Elements/NewReports' },
            { type => 'component',  name => '/RTIR/Elements/UserDueIncidents' },
            { type => 'component',  name => '/RTIR/Elements/DueIncidents' },
        ],
        summary => [
            { type => 'component', name => 'RefreshHomepage' },
        ]
    },
} );

@Final = ( sub {
    $| = 1;
    my $CurrentUser = RT::CurrentUser->new();
    $CurrentUser->LoadByName('RT_System');

    require RT::FM::Class;
    my $class = RT::FM::Class->new($CurrentUser);
    $class->Load('Templates');
    unless ($class->Id) {
        print "  Creating 'Templates' RTFM class..";
        my ($id, $msg) = $class->Create(
            Name => 'Templates',
            Description => 'Response templates',
            HotList => 1
        );
        die $msg unless $id;
        print "Done\n";
    }

    my $response = RT::CustomField->new($CurrentUser);
    $response->Load('Response');
    unless ($response->Id and $response->LookupType eq RT::FM::Article->CustomFieldLookupType) {
        print "  Creating 'Response' RTFM custom field..";
        my ($id, $msg) = $response->Create(
            Name => 'Response',
            Type => 'Text',
            Description => 'Response to be inserted into the ticket',
            LookupType => RT::FM::Article->CustomFieldLookupType,
        );
        die $msg unless $id;
        print "Done\n";
    }

    $response->AddToObject($class);
    $class->SetAttribute(Name => "Skip-$_", Content => 1)
        for ("Name", "Summary", "CF-Title-".$response->Id);

    my $group = RT::Group->new($CurrentUser);
    $group->LoadUserDefinedGroup( "DutyTeam" );
    die "Can't load group" unless $group->Id;

    $group->PrincipalObj->GrantRight( Right => $_, Object => $response )
        for qw/SeeCustomField ModifyCustomField/;

    $group->PrincipalObj->GrantRight( Right => $_, Object => $class )
        for qw/AdminClass AdminTopics CreateArticle ModifyArticle ModifyArticleTopics
               SeeClass ShowArticle ShowArticleHistory DeleteArticle/;

    print "Done.\n";
} );
