#!/usr/bin/php
<?php

use eArc\Core\Configuration;
use eArc\DI\DI;
use eArc\EventTree\Exceptions\InvalidObserverNodeException;
use eArc\EventTree\Interfaces\SortableListenerInterface;
use eArc\EventTree\Transformation\ObserverTree;use eArc\EventTree\Util\CompositeDir;
use eArc\EventTree\Interfaces\PhaseSpecificListenerInterface;
use eArc\EventTree\Util\DirectiveReader;

$vendorDir = dirname(__DIR__).'/vendor';

if (!is_dir($vendorDir)) {
    $vendorDir = dirname(__DIR__, 3);
}

require $vendorDir.'/autoload.php';

DI::init();
Configuration::build($argv[1]);

function eventPhasesToString(int $eventPhases): string
{
    if (ObserverTree::PHASE_ACCESS === $eventPhases) {
        return 'access';
    }

    $arr = [];

    if (ObserverTree::PHASE_START & $eventPhases) {
        $arr[] = 'start';
    }

    if (ObserverTree::PHASE_BEFORE & $eventPhases) {
        $arr[] = 'before';
    }

    if (ObserverTree::PHASE_DESTINATION & $eventPhases) {
        $arr[] = 'destination';
    }

    if (ObserverTree::PHASE_BEYOND & $eventPhases) {
        $arr[] = 'beyond';
    }

    return implode(' | ', $arr);
}

/**
 * @param string $path
 * @param int    $indent
 *
 * @throws InvalidObserverNodeException
 */
function iteratePath(string $path, int $indent): void
{
    foreach (CompositeDir::getSubDirNames($path) as $name) {
        $redirectDirective = DirectiveReader::getRedirect($path);
        $newPath = $redirectDirective->getPathForLeaf($name);

        echo str_pad('', $indent*4, ' ').$name."\n";

        foreach (di_get(CompositeDir::class)->collectListener($newPath) as $listener => $phase) {
            echo str_pad('', $indent*4+2, '    ').'- ';
            $phase = eventPhasesToString(is_subclass_of($listener, PhaseSpecificListenerInterface::class) ? $listener::getPhase() : ObserverTree::PHASE_ACCESS);
            $patience = is_subclass_of($listener, SortableListenerInterface::class) ? $listener::getPatience() : 0;
            echo "[$phase, $patience] ".$listener."\n";
        }

        iteratePath($newPath, $indent+1);
    }
}

$path = '.';
iteratePath($path, 0);
