The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::SD::Replica::rt::PushEncoder;
use Any::Moose; 

extends 'App::SD::ForeignReplica::PushEncoder';

use Params::Validate;

has sync_source => 
    ( isa => 'App::SD::Replica::rt',
      is => 'rw');

sub integrate_ticket_update {
    my $self = shift;
    my ( $change, $changeset ) = validate_pos(
        @_,
        { isa => 'Prophet::Change' },
        { isa => 'Prophet::ChangeSet' }
    );
    # Figure out the remote site's ticket ID for this change's record
    my $remote_ticket_id = $self->sync_source->remote_id_for_uuid( $change->record_uuid );
    my $ticket = RT::Client::REST::Ticket->new(
        rt => $self->sync_source->rt,
        id => $remote_ticket_id,
        %{ $self->_recode_props_for_integrate($change) }
    )->store();

    return $remote_ticket_id;
}

sub integrate_ticket_create {
    my $self = shift;
    my ( $change, $changeset ) = validate_pos(
        @_,
        { isa => 'Prophet::Change' },
        { isa => 'Prophet::ChangeSet' }
    );

    # Build up a ticket object out of all the record's attributes
    my $ticket = RT::Client::REST::Ticket->new(
        rt    => $self->sync_source->rt,
        queue => $self->sync_source->rt_queue(),
        %{ $self->_recode_props_for_integrate($change) }
    )->store( text => "Not yet pulling in ticket creation comment" );

    return $ticket->id;
}

sub integrate_comment {
    my $self = shift;
    my ($change, $changeset) = validate_pos( @_, { isa => 'Prophet::Change' }, {isa => 'Prophet::ChangeSet'} );

    my %props = map { $_->name => $_->new_value } $change->prop_changes;
    my $ticket_id     = $self->sync_source->remote_id_for_uuid( $props{'ticket'} );
    # Figure out the remote site's ticket ID for this change's record


    my $ticket = RT::Client::REST::Ticket->new( rt => $self->sync_source->rt, id => $ticket_id);

    my %content = ( message => $props{'content'},   
                );

    if (  ($props{'type'} ||'') eq 'comment' ) {
        $ticket->comment( %content);
    } else {
        $ticket->correspond(%content);
    }
    return $ticket_id;
} 

sub integrate_attachment {
    my ($self, $change, $changeset ) = validate_pos( @_, { isa => 'App::SD::Replica::rt::PushEncoder'}, { isa => 'Prophet::Change' }, { isa => 'Prophet::ChangeSet' });

    my %props = map { $_->name => $_->new_value } $change->prop_changes;
    my $ticket_id = $self->sync_source->remote_id_for_uuid( $props{'ticket'});
    my $ticket = RT::Client::REST::Ticket->new( rt => $self->sync_source->rt, id => $ticket_id );

    my $tempdir = File::Temp::tempdir( CLEANUP => 1 );
    my $file = File::Spec->catfile( $tempdir, ( $props{'name'} || 'unnamed' ) );
    open my $fh, '>', $file or die $!;
    print $fh $props{content};
    close $fh;
    my %content = ( message     => '(See attachments)', attachments => ["$file"]);
    $ticket->correspond(%content);
    return $ticket_id;
}

sub _recode_props_for_integrate {
    my $self = shift;
    my ($change) = validate_pos( @_, { isa => 'Prophet::Change' } );

    my %props = map { $_->name => $_->new_value } $change->prop_changes;
    my %attr;

    for my $key ( keys %props ) {
        next unless ( $key =~ /^(summary|queue|status|owner|custom)/ );
        if ( $key =~ /^custom-(.*)/ ) {
            $attr{cf}->{$1} = $props{$key};
        } elsif ( $key eq 'summary' ) {
            $attr{'subject'} = $props{summary};
        } else {
            $attr{$key} = $props{$key};
        }
        if ( $key eq 'status' ) {
            $attr{$key} =~ s/^closed$/resolved/;
        }
    }
    return \%attr;
}


__PACKAGE__->meta->make_immutable;
no Any::Moose;

1;