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

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

/**
 * Hook: Synchronisiert AdvowareAkte zwischen Kündigung und Räumungsklage
 * 
 * Wenn eine Kündigung mit einer Räumungsklage verknüpft wird:
 * - Prüfe ob Räumungsklage eine AdvowareAkte hat
 * - Wenn ja, verknüpfe diese Akte auch mit der Kündigung
 * - Übernehme/Synchronisiere Aktennummer und Aktenzeichen
 */
class SyncAdvowareAkte implements AfterRelate
{
    private static array $processing = [];
    
    public function __construct(
        private \Espo\ORM\EntityManager $entityManager
    ) {}
    
    public function afterRelate(
        Entity $entity,
        string $relationName,
        Entity $foreignEntity,
        array $columnData,
        \Espo\ORM\Repository\Option\RelateOptions $options
    ): void {
        // Nur für vmhRumungsklages-Beziehung (wenn Räumungsklage zu Kündigung hinzugefügt wird)
        if ($relationName !== 'vmhRumungsklages') {
            return;
        }
        
        // Vermeide Loops
        $key = $entity->getId() . '-' . $foreignEntity->getId() . '-sync-akte';
        if (isset(self::$processing[$key])) {
            return;
        }
        self::$processing[$key] = true;
        
        try {
            // $entity = CKuendigung
            // $foreignEntity = CVmhRumungsklage
            
            // Hole AdvowareAkte von der Räumungsklage (hasOne relationship - get via field)
            $advowareAkteId = $foreignEntity->get('advowareAktenId');
            
            if ($advowareAkteId) {
                $advowareAkte = $this->entityManager->getEntity('CAkten', $advowareAkteId);
                
                if ($advowareAkte) {
                    $GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Found AdvowareAkte {$advowareAkte->getId()} on Räumungsklage {$foreignEntity->getId()}");
                    
                    // Prüfe ob Kündigung bereits eine andere Akte hat
                    $existingAktenId = $entity->get('advowareAktenId');
                    
                    if ($existingAktenId && $existingAktenId !== $advowareAkteId) {
                        $GLOBALS['log']->warning("CKuendigung SyncAdvowareAkte: Kündigung already has different AdvowareAkte {$existingAktenId}, will replace with {$advowareAkteId}");
                    }
                    
                    // Verknüpfe AdvowareAkte mit Kündigung (belongsTo relationship - set field directly)
                    $entity->set('advowareAktenId', $advowareAkteId);
                    
                    // Synchronisiere nur Aktennummer (Aktenzeichen kommt über Beziehung)
                    if (!$entity->get('aktennr') && $advowareAkte->get('aktennummer')) {
                        $entity->set('aktennr', $advowareAkte->get('aktennummer'));
                    }
                    
                    // Save once with all changes
                    $this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
                    $GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Successfully linked AdvowareAkte and synchronized Aktennummer to Kündigung");
                }
            } else {
                $GLOBALS['log']->info("CKuendigung SyncAdvowareAkte: Räumungsklage {$foreignEntity->getId()} has no AdvowareAkte yet");
            }
            
        } catch (\Exception $e) {
            $GLOBALS['log']->error('CKuendigung SyncAdvowareAkte Error: ' . $e->getMessage());
        } finally {
            unset(self::$processing[$key]);
        }
    }
}
