#!/usr/bin/env php
<?php
use Bravo3\Properties\Conf;
use Bravo3\Workflow\Drivers\Swf\SwfWorkerEngine;
use Bravo3\Workflow\Drivers\Swf\SwfWorkflowEngine;
use Bravo3\Workflow\Enum\Event;
use Bravo3\Workflow\Events\PollingEvent;
use Bravo3\Workflow\Flags\MemoryFlag;
use Bravo3\Workflow\Memory\RedisMemoryPool;
use Bravo3\Workflow\Services\Worker;
use Bravo3\Workflow\Tests\Resources\TestLogger;
use Bravo3\Workflow\Workflow\YamlWorkflow;

require_once('bootstrap.php');

Conf::init(__DIR__.'/config');
$conf = Conf::getInstance();

$logger = new TestLogger();

$onPoll = function (PollingEvent $event) use ($logger) {
    $logger->info("Polling..");
};

$logger->debug('Creating memory pool..');
$pool = new RedisMemoryPool('test-workflow', 600, $conf['redis']);

$logger->debug('Creating YAML based workflow..');
$wf = new YamlWorkflow(__DIR__.'/Bravo3/Workflow/Tests/Resources/TestSchema.yml');
$wf->setDomain($conf['swf']['domain']);

$logger->debug('Creating SWF workflow engine..');
$workflow_engine = new SwfWorkflowEngine($conf['aws']);
$workflow_engine->setLogger($logger);
$workflow_engine->setWorkflow($wf);

$logger->debug('Creating SWF worker engine..');
$worker_engine = new SwfWorkerEngine($conf['aws']);
$worker_engine->setLogger($logger);
$worker_engine->setWorkflow($wf);

$logger->debug('Creating worker..');
$worker = new Worker();
$worker->setWorkflow($wf);
$worker->setMemoryPool($pool);
$worker->setAuxPayload('payload');

$logger->debug('Subscribing..');
$worker_engine->addSubscriber($worker);
$worker_engine->addListener(Event::DAEMON_POLLING, $onPoll);

// Decider will set this for us when the workflow completes
$abort_flag = new MemoryFlag($pool, ':global-complete');

$logger->debug('Starting daemon..');
$worker_engine->daemonise($abort_flag);


