<%init>
use Regexp::Common qw(RE_net_IPv4);
use URI::URL;

my $web_path = RT->Config->Get('WebPath');

my %super = %{$ARGS{actions}};

my %actions;
%actions = (
    default => sub {
        my %args = @_;
        return qq{<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}q=$args{value}">$args{value}</a>};
    },
    url => sub {
        my %args = @_;

        my $host = $args{'all_matches'}[3];
        my $super = $super{url} ? $super{url}->(%args) : $args{value};

        my $result = qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}type=host&q=$host">}
            .loc('lookup "[_1]"', $host) .qq{</a>]};
        return $super . qq{ <span class="clickylink">$result</span>};
    },
    url_overwrite => sub {
        my %args = @_;

        my $host = $args{'all_matches'}[3];
        my $super = $super{url_overwrite} ? $super{url_overwrite}->(%args) : $args{value};

        my $result = qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}type=host&q=$host">}
            .loc('lookup "[_1]"', $host) .qq{</a>]};
        return $super . qq{ <span class="clickylink">$result</span>};
    },
    ip => sub {
        my %args = @_;
        $args{host} ||= $args{value};
        my $result .= qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}type=ip&q=$args{host}">}
                      .loc('lookup IP') .q{</a>]};
        if ( $args{incident} && !RT->Config->Get('RTIR_DisableBlocksQueue') ) {
            $result .= qq{[<a href="$web_path/RTIR/Create.html?Incident=$args{incident}&Queue=Blocks&IP-Value=$args{host}">block</a>]};
        }
        if ( $args{'ticket'} && $args{'ticket'}->id ) {
            my $cf = RT::IR::GetCustomField('IP');
            my $tid = $args{'ticket'}->id;
            $result .= qq{[<a href="$web_path/RTIR/Edit.html?id=$tid}
                .qq{&Object-RT::Ticket-$tid-CustomField-}. $cf->id .qq{-AddValue=}
                . $m->interp->apply_escapes($args{host}, 'u', 'h')
                .q{&SaveChanges=1">}. loc('Add IP') .q{</a>]};
        }
        return $args{value} . qq{ <span class="clickylink">$result</span>};
    },
    ipdecimal => sub {
        my %args = @_;
        my $i = unpack "L",$args{value};
        return $args{value} unless $args{value} > 33554432;

        my $host = do {
            my $hostnum = sprintf "%lx", $i;
            my $a = hex( substr( $hostnum, 0, 2 ) );
            my $b = hex( substr( $hostnum, 2, 2 ) );
            my $c = hex( substr( $hostnum, 4, 2 ) );
            my $d = hex( substr( $hostnum, 6, 2 ) );
            "$a.$b.$c.$d";
        };
        return $actions{ip}->(%args, host => $host);
    },
    email => sub {
        my %args = @_;
        my $email = $args{'value'}; $email =~ s/^<|>$//g;
        RT::Interface::Web::EscapeUTF8( \$args{'value'} ); 
        my $domain = (split /@/, $email, 2)[1];

        my $result = qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{'lookup_params'}type=email&q=$email">}
                      .loc('lookup email') .q{</a>]};
        if ( $args{'incident'} ) {
            if ( $r->uri =~ /Lookup.html$/ ) {
                $result .= qq{<input type="checkbox" name="Requestorbox-$email" unchecked />};
            }
            $result .= qq{[<a href="$web_path/RTIR/Create.html}
                . qq{?Incident=$args{'incident'}&Queue=Investigations&Requestors=$email">}
                . loc('Investigate to') .qq{</a>]};
        }
        $result .= qq{ [<a href="$web_path/RTIR/Tools/Lookup.html?$args{'lookup_params'}type=host&q=$domain">}
               .loc('lookup "[_1]"', $domain) .qq{</a>]};
        return $args{'value'} . qq{ <span class="clickylink">$result</span>};
    },
    noc => sub {
        my %args = @_;
        my $result = qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}type=handle&q=$args{value}">}
               .loc('lookup') .qq{</a>]};
        return $args{value} . qq{ <span class="clickylink">$result</span>};
    },
    host => sub {
        my %args = @_;
        my $result = qq{[<a href="$web_path/RTIR/Tools/Lookup.html?$args{lookup_params}type=host&q=$args{value}">}
               .loc('lookup host') .qq{</a>]};
        return $args{value} . qq{ <span class="clickylink">$result</span>};
    },
);

use Regexp::IPv6 qw($IPv6_re);

my @types = (
    {
        name   => "ip",
        regex  => qr[(?<!\d)$RE{'net'}{'IPv4'}(?!\d)|(?<![0-9a-fA-F:])$IPv6_re(?![0-9a-fA-F:])]o,
        action => "ip",
    },
    {
        name   => "ipdecimal",
        regex  => q[\d{8,13}(?!=)],
        action => "ipdecimal",
    },
    {
        name   => "email",
        regex  => qr{(?:mailto:)?<?[\w\.\+-]+\@[\w\.-]+\.\w{2,3}>?},
        action => "email",
    },
    {
        name   => "domain",
        regex  => q[(?:[\w-]+\.)+[A-Za-z]{2,3}\b],
        action => "host",
    },
    {
        name   => "RIPE",
        regex  => q[(?-i:[A-Z][A-Z0-9-]+)],
        action => "noc",
    },
);

my $handle = ${$ARGS{handle}};
${$ARGS{handle}} = sub {
    my %args = @_;

    $args{incident} = $args{ticket}->id
      if $args{ticket} and $args{ticket}->QueueObj->Name eq 'Incidents';

    $args{lookup_params} = "ticket=".$args{ticket}->id
        if $args{ticket} && !$args{lookup_params};

    $args{lookup_params} .= "&"
      if $args{lookup_params} and $args{lookup_params} !~ /&$/;

    return $handle->(%args);
};

%{$ARGS{actions}} = ( %{$ARGS{actions}}, %actions );
push @{$ARGS{types}}, @types;

RT->Logger->info("Finished adding callbacks");

</%init>
