<?php
namespace Espo\Custom\Hooks\CDokumente;

use Espo\ORM\Entity;
use Espo\Core\Hook\Hook\AfterSave;

/**
 * Hook: Propagiert Dokumenten-Verlinkung von CDokumente nach oben zu Räumungsklage/Mietinkasso.
 *
 * Wenn ein Dokument direkt einer Akte zugewiesen wird (cAktenId gesetzt oder geändert):
 * → verknüpfe das Dokument auch via M2M mit der verbundenen Räumungsklage / dem Mietinkasso.
 *
 * Damit ist sichergestellt, dass über alle Einstiegspunkte (direktes CAkten-Panel,
 * cAktenId-Feld) die Beziehung vollständig ist.
 */
class PropagateDocumentsUp implements AfterSave
{
    private static array $processing = [];

    public function __construct(
        private \Espo\ORM\EntityManager $entityManager
    ) {}

    public function afterSave(Entity $entity, \Espo\ORM\Repository\Option\SaveOptions $options): void
    {
        if ($options->get('skipHooks')) {
            return;
        }

        $akteId = $entity->get('cAktenId');
        if (!$akteId) {
            return;
        }

        // Nur wenn cAktenId neu gesetzt oder geändert wurde
        if (!$entity->isNew() && !$entity->isAttributeChanged('cAktenId')) {
            return;
        }

        $key = $akteId . '-' . $entity->getId() . '-propagate-up';
        if (isset(self::$processing[$key])) {
            return;
        }
        self::$processing[$key] = true;

        try {
            $akte = $this->entityManager->getEntity('CAkten', $akteId);
            if (!$akte) {
                return;
            }

            $raumungsklage = $this->entityManager
                ->getRDBRepository('CAkten')
                ->getRelation($akte, 'vmhRumungsklage')
                ->findOne();

            if ($raumungsklage) {
                $this->relateDocument($raumungsklage, 'dokumentesvmhraumungsklage', $entity);
            }

            $mietinkasso = $this->entityManager
                ->getRDBRepository('CAkten')
                ->getRelation($akte, 'mietinkasso')
                ->findOne();

            if ($mietinkasso) {
                $this->relateDocument($mietinkasso, 'dokumentesmietinkasso', $entity);
            }

        } catch (\Exception $e) {
            $GLOBALS['log']->error('CDokumente PropagateDocumentsUp Error: ' . $e->getMessage());
        } finally {
            unset(self::$processing[$key]);
        }
    }

    private function relateDocument(Entity $parentEntity, string $relationName, Entity $document): void
    {
        $repository = $this->entityManager->getRDBRepository($parentEntity->getEntityType());
        $relation = $repository->getRelation($parentEntity, $relationName);

        $isRelated = $relation
            ->where(['id' => $document->getId()])
            ->findOne();

        if (!$isRelated) {
            $relation->relate($document);
        }
    }
}
