#!/usr/bin/perl -w
# --
# bin/SlaveUpdate.pm 
# --
# Updates Master Slave info after upgrade to OTRSMasterSlave 1.2.8
# --
# Copyright (C) 2012 ib-salut suport.sistemes@ibsalut.es
# --

use strict;
use warnings;

# use ../ as lib location
use File::Basename;
use FindBin qw($RealBin);
use lib dirname($RealBin);

use Kernel::Config;
use Kernel::System::Encode;
use Kernel::System::Log;
use Kernel::System::DB;
use Kernel::System::PID;
use Kernel::System::Main;
use Kernel::System::Time;
use Kernel::System::Ticket;
use Kernel::System::Queue;
use Kernel::System::CustomerUser;
use Kernel::System::GenericAgent;
use Kernel::System::LinkObject;
use Kernel::System::DynamicField;
use Kernel::System::DynamicField::Backend;

# common objects
my %CommonObject = ();
$CommonObject{ConfigObject} = Kernel::Config->new();
$CommonObject{EncodeObject} = Kernel::System::Encode->new(%CommonObject);
$CommonObject{LogObject}    = Kernel::System::Log->new(
    LogPrefix => 'OTRS-otrs.GenericAgent.pl',
    %CommonObject,
);
$CommonObject{MainObject}        = Kernel::System::Main->new(%CommonObject);
$CommonObject{DBObject}          = Kernel::System::DB->new(%CommonObject);
$CommonObject{PIDObject}         = Kernel::System::PID->new(%CommonObject);
$CommonObject{TimeObject}        = Kernel::System::Time->new(%CommonObject);
$CommonObject{TicketObject}      = Kernel::System::Ticket->new( %CommonObject);
$CommonObject{QueueObject}       = Kernel::System::Queue->new(%CommonObject);
$CommonObject{CustomerUserObject}= Kernel::System::CustomerUser->new(%CommonObject);
$CommonObject{GenericAgentObject}= Kernel::System::GenericAgent->new(
    %CommonObject,
    # NoticeSTDOUT => 1,
);
$CommonObject{LinkObject}         = Kernel::System::LinkObject->new(%CommonObject);
$CommonObject{DynamicFieldObject} = Kernel::System::DynamicField->new(%CommonObject);
$CommonObject{BackendObject}      = Kernel::System::DynamicField::Backend->new(%CommonObject);

# set generic agent uid
my $UserIDOfGenericAgent = 1;

my $JobName = 'GenericAgentSlaveUpdate';

    my $MasterSlaveDynamicField   = $CommonObject{ConfigObject}->Get('MasterSlave::DynamicField');

    my @TicketIDs = $CommonObject{TicketObject}->TicketSearch(
        # result (required)
        Result                     => 'ARRAY',
        # master slave dynamic field
        'DynamicField_' . $MasterSlaveDynamicField => {
            Equals => 'Slave',
        },
        UserID     => $UserIDOfGenericAgent,
        Permission => 'ro',
    );

    SLAVE:
    for my $SlaveTicketID ( @TicketIDs ){
        my %Links = $CommonObject{LinkObject}->LinkKeyList(
            Object1   => 'Ticket',
            Key1      => $SlaveTicketID,
            Object2   => 'Ticket',
            State     => 'Valid',
            Type      => 'ParentChild',      # (optional)
            Direction => 'Source',           # (optional) default Both (Source|Target|Both)
            UserID    => $UserIDOfGenericAgent,
        );
        TARGETMASTER:
        for my $TargetTicketID ( keys %Links ) {
            my %TargetTicket = $CommonObject{TicketObject}->TicketGet(
                TicketID      => $TargetTicketID,
                DynamicFields => 1,
            );

            # check if it's a master/slave ticket
            next TARGETMASTER if !$TargetTicket{ 'DynamicField_' . $MasterSlaveDynamicField };
            next TARGETMASTER if $TargetTicket{ 'DynamicField_' . $MasterSlaveDynamicField } !~ /^(master|yes)$/i;

            # update dynamic field value for slave ticket
            # get dynamic field config
            my $DynamicField = $CommonObject{DynamicFieldObject}->DynamicFieldGet(
                Name => $MasterSlaveDynamicField,
            );
            $CommonObject{BackendObject}->ValueSet(
                DynamicFieldConfig => $DynamicField,
                ObjectID           => $SlaveTicketID,
                Value              => 'SlaveOf:' . $TargetTicket{TicketNumber},
                UserID             => $UserIDOfGenericAgent,
            );
            print "Slave Ticket $SlaveTicketID has been relinked to Master Ticket $TargetTicketID\n";
            next SLAVE;
        }
        print "Unable to relink Slave Ticket $SlaveTicketID\n";
    }

exit(0);
