<?php

declare(strict_types=1);

namespace App\Framework\Discovery;

use App\Framework\Cache\Cache;
use App\Framework\Cache\CacheKey;
use App\Framework\Core\ValueObjects\ClassName;
use App\Framework\Filesystem\ValueObjects\FilePath;

/**
 * Interface für File-Visitor, die beim Scannen von Dateien verwendet werden
 */
interface FileVisitor
{
    /**
     * Wird aufgerufen, wenn der Scan beginnt
     */
    public function onScanStart(): void;

    /**
     * Wird für jede gefundene Klasse aufgerufen
     */
    public function visitClass(ClassName $className, FilePath $filePath): void;

    /**
     * Wird aufgerufen, wenn der Scan abgeschlossen ist
     */
    public function onScanComplete(): void;

    /**
     * Wird aufgerufen, wenn ein inkrementeller Scan beginnt
     */
    public function onIncrementalScanStart(): void;

    /**
     * Wird aufgerufen, wenn ein inkrementeller Scan abgeschlossen ist
     */
    public function onIncrementalScanComplete(): void;

    /**
     * Lädt Daten aus dem Cache
     */
    public function loadFromCache(Cache $cache): void;

    /**
     * Liefert den Cache-Schlüssel für diesen Visitor
     */
    public function getCacheKey(): CacheKey;

    /**
     * Liefert die zu cachenden Daten des Visitors
     *
     * @return mixed Die zu cachenden Daten
     */
    public function getCacheableData(): mixed;
}
