#!/usr/bin/env php
<?php
use Bravo3\Properties\Conf;
use Bravo3\Workflow\Drivers\Swf\SwfDecisionEngine;
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\Decider;
use Bravo3\Workflow\Tests\Resources\TestLogger;
use Bravo3\Workflow\Tests\Resources\Workflow\Callbacks;
use Bravo3\Workflow\Workflow\YamlWorkflow;

require_once('bootstrap.php');

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

$logger = new TestLogger();

Callbacks::getInstance()->setLogger($logger);

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

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

Callbacks::getInstance()->setMemoryPool($pool);

$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 decision engine..');
$decision_engine = new SwfDecisionEngine($conf['aws']);
$decision_engine->setLogger($logger);
$decision_engine->setWorkflow($wf);

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

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

$logger->debug('Creating new workflow..');
$execution_id = 'unit-test-'.time();
$wf = $workflow_engine->createWorkflow($execution_id);
$logger->info(" > Execution: ".$wf->getExecutionId());
$logger->info(" > Run ID:    ".$wf->getRunId());

$abort_flag = new MemoryFlag($pool, ':'.$execution_id.':complete');

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

// Pass a flag to let the worker (which doesn't know the execution ID) abort, too
$pool->set(":global-complete", "1");
