<?php

namespace App\Services\Communication;

use App\Core\Hook\HookManager;

/**
 * PRC-622 — config/communication_events.php 'hooks' haritasındaki her hook adı
 * için HookManager'a action listener kaydeder. HookBridge::fireAction o hook'u
 * fire ettiğinde mapper non-null CommunicationEvent dönerse event() ile
 * dispatch edilir; kanal kararı CommunicationDispatcher'dadır.
 *
 * Yeni hook → şablon bağlamak = config'e satır eklemek; kod değişmez.
 */
class HookCommunicationBridge
{
    public function __construct(
        private HookManager $hooks,
        private CommunicationEventMapper $mapper,
    ) {}

    public function register(): void
    {
        foreach (config('communication_events.hooks', []) as $hookName => $mappings) {
            if (! is_string($hookName) || ! is_array($mappings) || $mappings === []) {
                continue;
            }

            $this->hooks->listenAction($hookName, function (array $context) use ($mappings): void {
                foreach ($mappings as $mapping) {
                    if (! is_array($mapping)) {
                        continue;
                    }

                    $communicationEvent = $this->mapper->mapFromHookContext($mapping, $context);
                    if ($communicationEvent !== null) {
                        event($communicationEvent);
                    }
                }
            });
        }
    }
}
