<?php

namespace Copona\System\engine;

use Copona\Exception\ActionException;

class Front
{
    private $registry;
    private $pre_action = array();
    private $error;

    public function __construct($registry)
    {
        $this->registry = $registry;
    }

    public function addPreAction(Action $pre_action)
    {
        $this->pre_action[] = $pre_action;
    }

    public function dispatch(Action $action, Action $error)
    {
        $this->error = $error;

        foreach ($this->pre_action as $pre_action) {
            $result = $this->execute($pre_action);

            if ($result instanceof Action) {
                $action = $result;
                break;
            }
        }

        while ($action instanceof Action) {
            $action = $this->execute($action);
        }
    }

    private function execute(Action $action)
    {
        try {

            $result = $action->execute($this->registry);

            if ($result instanceof Action) {
                return $result;
            }

        } catch (ActionException $e) {

            $action = $this->error;
            $this->error = null;
            return $action;

        }
    }
}