<?php

namespace BookStack\Activity\Notifications;

use BookStack\Activity\ActivityType;
use BookStack\Activity\Models\Activity;
use BookStack\Activity\Models\Loggable;
use BookStack\Activity\Notifications\Handlers\CommentCreationNotificationHandler;
use BookStack\Activity\Notifications\Handlers\CommentMentionNotificationHandler;
use BookStack\Activity\Notifications\Handlers\NotificationHandler;
use BookStack\Activity\Notifications\Handlers\PageCreationNotificationHandler;
use BookStack\Activity\Notifications\Handlers\PageUpdateNotificationHandler;
use BookStack\Users\Models\User;

class NotificationManager
{
    /**
     * @var class-string<NotificationHandler>[]
     */
    protected array $handlers = [];

    public function handle(Activity $activity, string|Loggable $detail, User $user): void
    {
        $activityType = $activity->type;
        $handlersToRun = $this->handlers[$activityType] ?? [];
        foreach ($handlersToRun as $handlerClass) {
            /** @var NotificationHandler $handler */
            $handler = new $handlerClass();
            $handler->handle($activity, $detail, $user);
        }
    }

    /**
     * @param class-string<NotificationHandler> $handlerClass
     */
    public function registerHandler(string $activityType, string $handlerClass): void
    {
        if (!isset($this->handlers[$activityType])) {
            $this->handlers[$activityType] = [];
        }

        if (!in_array($handlerClass, $this->handlers[$activityType])) {
            $this->handlers[$activityType][] = $handlerClass;
        }
    }

    public function loadDefaultHandlers(): void
    {
        $this->registerHandler(ActivityType::PAGE_CREATE, PageCreationNotificationHandler::class);
        $this->registerHandler(ActivityType::PAGE_UPDATE, PageUpdateNotificationHandler::class);
        $this->registerHandler(ActivityType::COMMENT_CREATE, CommentCreationNotificationHandler::class);
        $this->registerHandler(ActivityType::COMMENT_CREATE, CommentMentionNotificationHandler::class);
        $this->registerHandler(ActivityType::COMMENT_UPDATE, CommentMentionNotificationHandler::class);
    }
}
