<?php

require '../../config.php';
require_once 'DebugObserver.php';
require_once 'TextWorker.php';
require_once 'UppercaseTask.php';
use Falx\Concurrency\PooledProcesses\Execution;
use Falx\Concurrency\PooledProcesses\Communication\SharedMemory\Factory as SharedMemoryHandleFactory;
$t1 = new UppercaseTask('1');
$t2 = new UppercaseTask('2');
$t3 = new UppercaseTask('3');
$obs1 = new CommunicationObserver('Lorem ipsum dolor sit amet, nec an unum etiam congue, vel ea scaevola honestatis. In tota periculis disputationi cum, et case mollis nominati usu. Ad duo dicit pericula aliquando, mei iudico dolorem vituperatoribus ea.');
$obs2 = new CommunicationObserver('Te causae percipitur nec, case delectus partiendo has ut. Mei menandri quaerendum id, unum legere iuvaret mei an, vis ea integre aliquando adipiscing. Ne est audiam recusabo intellegebat, nonumes moderatius consectetuer no est.');
$obs3 = new CommunicationObserver('Cum laudem altera consulatu ut. Suas dictas ius cu. Te rationibus mediocritatem vix, ad summo putant signiferumque sed.');
$workerFactory = new WorkerFactory();
$ipcHandleFactory = new SharedMemoryHandleFactory();
$statusObserver = new DebugObserver();
$e = new Execution($workerFactory, 2, $statusObserver, $ipcHandleFactory);
$e->execute($t1, $obs1);
$e->execute($t2, $obs2);
$e->execute($t3, $obs3);
$e->wait(function () use($obs1, $obs2, $obs3) {
    print 'UPPERCASED RESULTS: ' . PHP_EOL;
    print $obs1->getFinalString() . PHP_EOL . PHP_EOL;
    print $obs2->getFinalString() . PHP_EOL . PHP_EOL;
    print $obs3->getFinalString() . PHP_EOL . PHP_EOL;
});
print 'PARENT MAIN SCRIPT FINISHED' . PHP_EOL;
{
    public function execute(Task $task)
    {
        print $task->getData() . ' START' . PHP_EOL;
        sleep(rand(1, 5));
        print $task->getData() . ' FINISH' . PHP_EOL;
    }
}
class DebugObserver implements StatusObserver
{
    public function notifyProcessStatus($pid, ProcessStatus $status, Task $task)
    {
        print "OBSERVER: Worker {$pid} finished with status {$status->getStatus()} doing {$task->getData()}\n";
    }
}
$t1 = new DummyTask('one');
$t2 = new DummyTask('two');
$t3 = new DummyTask('three');
$t4 = new DummyTask('four');
$t5 = new DummyTask('five');
$t6 = new DummyTask('six');
$logger = new DebugObserver();
$workerFactory = new WorkerFactory();
$e = new Execution($workerFactory, 3, $logger);
$e->execute($t1);
$e->execute($t2);
$e->execute($t3);
$e->execute($t4);
$e->execute($t5);
$e->execute($t6);
print 'PARENT MAIN SCRIPT FINISHED' . PHP_EOL;