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

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

/**
 * Hook: Erstellt automatisch AdvowareAkte für Kündigung
 * 
 * Wenn eine Kündigung erstellt/gespeichert wird:
 * - Prüfe ob bereits eine AdvowareAkte vorhanden ist (über verknüpfte Räumungsklage)
 * - Wenn nein: Erstelle neue AdvowareAkte und verknüpfe sie
 */
class CreateAdvowareAkte implements AfterSave
{
    private static array $processing = [];
    
    public function __construct(
        private \Espo\ORM\EntityManager $entityManager,
        private \Espo\Core\InjectableFactory $injectableFactory
    ) {}
    
    public function afterSave(
        Entity $entity,
        \Espo\ORM\Repository\Option\SaveOptions $options
    ): void {
        // Skip if silent or during hooks
        if ($options->get('silent') || $options->get('skipHooks')) {
            return;
        }
        
        // Vermeide Loops
        $key = $entity->getId() . '-create-akte';
        if (isset(self::$processing[$key])) {
            return;
        }
        self::$processing[$key] = true;
        
        try {
            // Prüfe ob Kündigung bereits eine AdvowareAkte hat
            $existingAkteId = $entity->get('advowareAktenId');
            
            if ($existingAkteId) {
                $GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Kündigung already has AdvowareAkte: {$existingAkteId}");
                unset(self::$processing[$key]);
                return; // Bereits vorhanden
            }
            
            // Prüfe ob verknüpfte Räumungsklagen eine Akte haben
            $raeumungsklagen = $this->entityManager
                ->getRDBRepository('CKuendigung')
                ->getRelation($entity, 'vmhRumungsklages')
                ->find();
            
            foreach ($raeumungsklagen as $rk) {
                $rkAkteId = $rk->get('advowareAktenId');
                if ($rkAkteId) {
                    // Übernehme Akte von Räumungsklage
                    $entity->set('advowareAktenId', $rkAkteId);
                    $this->entityManager->saveEntity($entity, ['silent' => true, 'skipHooks' => true]);
                    
                    // Synchronisiere Aktennummer
                    $akte = $this->entityManager->getEntity('CAkten', $rkAkteId);
                    if ($akte) {
                        $this->syncAktennummer($entity, $akte);
                    }
                    
                    $GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Using AdvowareAkte from Räumungsklage: {$rkAkteId}");
                    unset(self::$processing[$key]);
                    return;
                }
            }
            
            // Keine Akte gefunden -> Erstelle neue
            $this->createNewAkte($entity);
            
        } catch (\Exception $e) {
            $GLOBALS['log']->error('CKuendigung CreateAdvowareAkte Error: ' . $e->getMessage());
        } finally {
            unset(self::$processing[$key]);
        }
    }
    
    private function createNewAkte(Entity $kuendigung): void
    {
        // Hole Aktennummer aus Kündigung (falls vorhanden)
        $aktennummer = $kuendigung->get('aktennr');
        if (!$aktennummer) {
            $aktennummer = time();
        }
        
        // Erstelle AdvowareAkte (aktenzeichen bleibt leer)
        $akteData = [
            'name' => 'Advoware Akte - ' . $kuendigung->get('name'),
            'aktennummer' => $aktennummer,
            'syncStatus' => 'unclean',
            'assignedUserId' => $kuendigung->get('assignedUserId')
        ];
        
        // Copy teams
        $teamsIds = $kuendigung->getLinkMultipleIdList('teams');
        if (!empty($teamsIds)) {
            $akteData['teamsIds'] = $teamsIds;
        }
        
        $akte = $this->entityManager->createEntity('CAkten', $akteData);
        
        if ($akte) {
            // Verknüpfe mit Kündigung
            $kuendigung->set('advowareAktenId', $akte->getId());
            $this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
            
            // Synchronisiere Aktennummer zurück zur Kündigung (falls leer war)
            if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
                $kuendigung->set('aktennr', $akte->get('aktennummer'));
                $this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
            }
            
            $GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Created new AdvowareAkte: {$akte->getId()}");
        } else {
            $GLOBALS['log']->error('CKuendigung CreateAdvowareAkte: Failed to create AdvowareAkte');
        }
    }
    
    private function syncAktennummer(Entity $kuendigung, Entity $akte): void
    {
        // Synchronisiere nur Aktennummer (nicht Aktenzeichen, das ist in der Beziehung)
        if (!$kuendigung->get('aktennr') && $akte->get('aktennummer')) {
            $kuendigung->set('aktennr', $akte->get('aktennummer'));
            $this->entityManager->saveEntity($kuendigung, ['silent' => true, 'skipHooks' => true]);
            $GLOBALS['log']->info("CKuendigung CreateAdvowareAkte: Synchronized Aktennummer");
        }
    }
}
