#!/usr/bin/env php
<?php
/**
 * ACL-Berechtigungen für neue Junction Entities setzen
 * 
 * Dieses Skript fügt ACL-Berechtigungen für die folgenden Entities hinzu:
 * - CAdvowareAktenCDokumente
 * - CAICollectionCDokumente
 * - CPulsTeamZuordnung
 * 
 * Usage: php custom/scripts/set_junction_acl.php
 */

// Lade EspoCRM Config
$configFile = 'data/config-internal.php';
if (!file_exists($configFile)) {
    die("❌ Config-Datei nicht gefunden: {$configFile}\n");
}

$config = include $configFile;
$db = $config['database'];

try {
    // Datenbankverbindung
    $pdo = new PDO(
        "mysql:host={$db['host']};dbname={$db['dbname']}",
        $db['user'],
        $db['password']
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "================================================================\n";
    echo "  ACL-Berechtigungen für Junction Entities setzen\n";
    echo "================================================================\n\n";
    
    // Entities, für die ACL-Berechtigungen gesetzt werden sollen
    $entities = [
        'CAdvowareAktenCDokumente' => 'Advoware-Dokumente Junction',
        'CAICollectionCDokumente' => 'AI Collection-Dokumente Junction',
        'CPulsTeamZuordnung' => 'Puls-Team-Zuordnung'
    ];
    
    // Hole alle Rollen
    $stmt = $pdo->query("SELECT id, name, data FROM role WHERE deleted = 0");
    $roles = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo "Gefundene Rollen: " . count($roles) . "\n\n";
    
    $updatedCount = 0;
    
    foreach ($roles as $role) {
        $roleName = $role['name'];
        $roleId = $role['id'];
        $data = json_decode($role['data'], true);
        
        // Prüfe ob ACL-Daten existieren
        if (!isset($data['table'])) {
            $data['table'] = [];
        }
        
        $hasChanges = false;
        
        // Füge ACL für jede Entity hinzu
        foreach ($entities as $entity => $description) {
            if (!isset($data['table'][$entity])) {
                // Setze Standard-Berechtigungen basierend auf der Rolle
                if (stripos($roleName, 'admin') !== false) {
                    // Administrator: Volle Rechte
                    $data['table'][$entity] = [
                        'create' => 'yes',
                        'read' => 'all',
                        'edit' => 'all',
                        'delete' => 'all'
                    ];
                } else {
                    // Andere Rollen: Leserechte
                    $data['table'][$entity] = [
                        'create' => 'yes',
                        'read' => 'own',
                        'edit' => 'own',
                        'delete' => 'no'
                    ];
                }
                $hasChanges = true;
                echo "  ✓ {$entity} zu Rolle '{$roleName}' hinzugefügt\n";
            }
        }
        
        // Speichere nur wenn Änderungen vorgenommen wurden
        if ($hasChanges) {
            $jsonData = json_encode($data, JSON_UNESCAPED_UNICODE);
            $updateStmt = $pdo->prepare("UPDATE role SET data = :data WHERE id = :id");
            $updateStmt->execute([
                ':data' => $jsonData,
                ':id' => $roleId
            ]);
            $updatedCount++;
            echo "  → Rolle '{$roleName}' aktualisiert\n\n";
        }
    }
    
    echo "================================================================\n";
    echo "  ZUSAMMENFASSUNG\n";
    echo "================================================================\n\n";
    echo "✅ {$updatedCount} von " . count($roles) . " Rollen aktualisiert\n\n";
    
    if ($updatedCount > 0) {
        echo "Hinweis: Cache muss geleert werden!\n";
        echo "Führe aus: python3 custom/scripts/validate_and_rebuild.py\n\n";
    } else {
        echo "ℹ Keine Änderungen notwendig - alle Rollen haben bereits ACL für diese Entities\n\n";
    }
    
    // Zeige ACL-Status
    echo "================================================================\n";
    echo "  ACL-STATUS PRO ROLLE\n";
    echo "================================================================\n\n";
    
    foreach ($roles as $role) {
        $roleName = $role['name'];
        $data = json_decode($role['data'], true);
        
        echo "Rolle: {$roleName}\n";
        echo str_repeat("-", 60) . "\n";
        
        foreach ($entities as $entity => $description) {
            if (isset($data['table'][$entity])) {
                $acl = $data['table'][$entity];
                echo sprintf(
                    "  %-30s C:%-4s R:%-4s E:%-4s D:%-4s\n",
                    $entity,
                    $acl['create'] ?? 'no',
                    $acl['read'] ?? 'no',
                    $acl['edit'] ?? 'no',
                    $acl['delete'] ?? 'no'
                );
            } else {
                echo "  {$entity}: ⚠ KEINE ACL\n";
            }
        }
        echo "\n";
    }
    
} catch (PDOException $e) {
    echo "❌ Datenbankfehler: " . $e->getMessage() . "\n";
    exit(1);
} catch (Exception $e) {
    echo "❌ Fehler: " . $e->getMessage() . "\n";
    exit(1);
}

echo "✅ Erfolgreich abgeschlossen\n";
