<?php

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;

    require 'vendor/autoload.php';

    $api = "https://api.nau.ch";
    define('API_URL', $api);
    $bearer = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3NjI0MTY2NjYsIm5iZiI6MTc2MjQxNjY2NiwiZXhwIjoxNzc3OTY4NjY2LCJqdGkiOiJ2Qk95Q1laTXc3eXdPdXNZN2VpbHVJQ3poTXF4T2YiLCJ0dGwiOjIwNzc3NzY2NjYsInN1YiI6IjMzNTk5OCJ9.xJygIDjhTZvQRjpkENW4jSf5ONB93fL0wX9Jxra167E";
    // ist lektoratsuser

    $openai_key = "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";
    $anthropic_key = "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";

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    // Lockfile-System mit Redis
    $lockKey = 'lektorat_agent_lock';
    $lockTimeout = 1800; // 30 Minuten in Sekunden

    if($redis->exists($lockKey)) {
        print "Ein anderer Lektorat-Agent-Prozess läuft bereits. Beende.\n";
        exit(0);
    }

    // Setze Lock mit Ablaufzeit
    $redis->setex($lockKey, $lockTimeout, time());
    print "Lock gesetzt. Prozess startet.\n";

    // Register shutdown function to remove lock
    register_shutdown_function(function() use ($redis, $lockKey) {
        $redis->del($lockKey);
        print "Lock entfernt.\n";
    });
    
    if($redis->exists('lektorat_article')) {
        $article_data = $redis->get('lektorat_article');
        $article = json_decode($article_data, true);
        
        // Prüfe ob dieser Artikel auf der Skip-Liste ist
        if($redis->sIsMember('lektorat_skip_articles', $article['id'])) {
            print "Artikel-ID " . $article['id'] . " ist auf der Skip-Liste. Überspringe.\n";
            $redis->del('lektorat_article');
        } else {
            $article = removeNotSupportedElementTypes($article);
            
            // Speichere Original-Artikel für möglichen Retry bei 422-Fehler
            $originalArticle = $article;
        
        print "Artikel aus Redis geladen:\n";
        print "Artikel-ID: " . $article['id'] . "\n";
        //$article['lead'] = "Rücktritte im Verwaltungsrat der Industriellen Werke BaseL";
        //$article['elements'][3]['content'] = "<h2>Abschied von langjährigen Mietgliedern</h2>";
        //print_r($article);die;
        $checkElements = makeCheckElements($article);
        print "\n=== Elemente vor Lektorat ===\n";
        print_r($checkElements);
        
        // Lektorat durchführen
        print "\n=== Starte Lektorat mit OpenAI ===\n";
        $lektorat = lektoratWithOpenAI($checkElements);
        
        print "\n=== Änderungen ===\n";
        if(empty($lektorat['changed'])) {
            print "Keine Rechtschreibfehler gefunden.\n";
        } else {
            print_r($lektorat['changed']);
            // Sende E-Mail mit den Korrekturen
            sendCorrectionMail($article['id'], $article['title'], $lektorat['changed']);
        }
        
        // Übertrage Änderungen zurück ins originale Article-Array
        $article = applyLektoratToArticle($article, $lektorat);
        
        print "\n=== Artikel nach Lektorat ===\n";
        print "Titel: " . $article['title'] . "\n";
        print "Lead: " . $article['lead'] . "\n";
        
        $update = postUpdateArticle($article);
        print "Update Antwort: " . $update[0] . " (HTTP Code: " . $update[1] . ")\n";
        
        if($update[1] == 204 || $update[1] == 200) {
            print "Artikel erfolgreich aktualisiert.\n";
        } else if($update[1] == 422) {
            print "Fehler 422 (Unprocessable Entity) - analysiere Fehlermeldung...\n";
            $success = handle422Error($article, $update[0]);
            
            if(!$success) {
                print "Artikel kann nicht gespeichert werden - auf Skip-Liste gesetzt.\n";
                $redis->sAdd('lektorat_skip_articles', $article['id']);
                sendErrorMail($article['id'], $article['title'], 422, "Artikel konnte auch nach Entfernung aller problematischen Elemente nicht gespeichert werden. Artikel wurde auf Skip-Liste gesetzt.\n\nLetzte Fehlermeldung:\n" . $update[0]);
            }
        } else {
            print "Fehler beim Aktualisieren des Artikels.\n";
            // Sende Fehler-E-Mail an yk@nau.ch
            sendErrorMail($article['id'], $article['title'], $update[1], $update[0]);
        }
        $redis->del('lektorat_article');
        }
    }

    $data = getOpenArticles();
    $data_json = json_decode($data[0], true);
    $open_articles = $data_json['articles'];
    print "Offene Artikel: " . $open_articles . "\n";

    // alerter
    if($open_articles > 10) {
        sendAlertMail("tech@nau.ch", "Zu viele offene Artikel", "Es gibt derzeit mehr als 10 offene Artikel, bitte überprüfen Sie den LektoratsAgent.");
    }

    if($open_articles > 0) {
        $fetch = fetchOpenArticle();
        $redis->set('lektorat_article', $fetch[0]);
        $article = json_decode($fetch[0], true);
        print "Artikel-ID: " . $article['id'] . "\n";
        print "Titel: " . $article['title'] . "\n";
    }

    // functions from here

    function removeNotSupportedElementTypes($article) {
        $allowed = array('body','slider','image','video','externalvideo','learning','learnings','survey','title');
        foreach($article['elements'] as $key => $element) {
            if(!in_array($element['type'], $allowed)) {
                unset($article['elements'][$key]);
            }
            if(isset($element['lead']) && strlen($element['lead']) > 190) {
                unset($article['elements'][$key]);
            }
        }
        return $article;
    }

    function sendAlertMail($to, $subject, $message) {
        $mail = new PHPMailer(true);
        
        try {
            // SMTP Konfiguration
            $mail->isSMTP();
            $mail->Host = 'smtp.office365.com';
            $mail->SMTPAuth = true;
            $mail->Username = 'noreply@nau.ch';
            $mail->Password = 'Xm04I27&';
            $mail->SMTPSecure = 'tls';
            $mail->Port = 587;
            
            // Absender und Empfänger
            $mail->setFrom('noreply@nau.ch', 'Lektorats Agent');
            $mail->addAddress($to);
            
            // Inhalt
            $mail->isHTML(false);
            $mail->Subject = $subject;
            $mail->Body = $message;
            $mail->CharSet = 'UTF-8';
            
            $mail->send();
            print "E-Mail erfolgreich an $to gesendet.\n";
            return true;
        } catch (Exception $e) {
            print "E-Mail konnte nicht gesendet werden. Fehler: {$mail->ErrorInfo}\n";
            return false;
        }
    }

    function sendCorrectionMail($articleId, $articleTitle, $changes) {
        $mail = new PHPMailer(true);
        
        try {
            // SMTP Konfiguration
            $mail->isSMTP();
            $mail->Host = 'smtp.office365.com';
            $mail->SMTPAuth = true;
            $mail->Username = 'noreply@nau.ch';
            $mail->Password = 'Xm04I27&';
            $mail->SMTPSecure = 'tls';
            $mail->Port = 587;
            
            // Absender und Empfänger
            $mail->setFrom('noreply@nau.ch', 'Lektorats Agent');
            $mail->addAddress('yk@nau.ch');
            $mail->addAddress('anna.mikulics@nau.ch');
            
            // Inhalt erstellen
            $subject = "Lektorat: Korrekturen in Artikel #$articleId";
            
            $message = "Der Lektorats-Agent hat Rechtschreibfehler korrigiert:\n\n";
            $message .= "Artikel-ID: $articleId\n";
            $message .= "Titel: $articleTitle\n\n";
            $message .= "Folgende Korrekturen wurden vorgenommen:\n";
            $message .= str_repeat("-", 70) . "\n\n";
            
            foreach($changes as $index => $change) {
                $message .= "Korrektur " . ($index + 1) . ":\n";
                $message .= "Feld: " . $change['field'] . "\n";
                $message .= "Original: " . $change['original'] . "\n";
                $message .= "Korrigiert: " . $change['corrected'] . "\n";
                $message .= "Grund: " . $change['reason'] . "\n";
                $message .= str_repeat("-", 70) . "\n\n";
            }
            
            $mail->isHTML(false);
            $mail->Subject = $subject;
            $mail->Body = $message;
            $mail->CharSet = 'UTF-8';
            
            $mail->send();
            print "Korrektur-E-Mail erfolgreich an yk@nau.ch gesendet.\n";
            return true;
        } catch (Exception $e) {
            print "Korrektur-E-Mail konnte nicht gesendet werden. Fehler: {$mail->ErrorInfo}\n";
            return false;
        }
    }

    function sendErrorMail($articleId, $articleTitle, $httpCode, $responseBody) {
        $mail = new PHPMailer(true);
        
        try {
            // SMTP Konfiguration
            $mail->isSMTP();
            $mail->Host = 'smtp.office365.com';
            $mail->SMTPAuth = true;
            $mail->Username = 'noreply@nau.ch';
            $mail->Password = 'Xm04I27&';
            $mail->SMTPSecure = 'tls';
            $mail->Port = 587;
            
            // Absender und Empfänger
            $mail->setFrom('noreply@nau.ch', 'Lektorats Agent');
            $mail->addAddress('yk@nau.ch');
            
            // Inhalt erstellen
            $subject = "FEHLER: Lektorat-Agent konnte Artikel #$articleId nicht aktualisieren";
            
            $message = "Der Lektorats-Agent konnte einen Artikel nicht aktualisieren:\n\n";
            $message .= "Artikel-ID: $articleId\n";
            $message .= "Titel: $articleTitle\n";
            $message .= "HTTP Status Code: $httpCode\n\n";
            $message .= str_repeat("=", 70) . "\n";
            $message .= "API Response:\n";
            $message .= str_repeat("=", 70) . "\n\n";
            $message .= $responseBody;
            $message .= "\n\n" . str_repeat("=", 70) . "\n";
            $message .= "Bitte überprüfen Sie den Artikel manuell.\n";
            
            $mail->isHTML(false);
            $mail->Subject = $subject;
            $mail->Body = $message;
            $mail->CharSet = 'UTF-8';
            
            $mail->send();
            print "Fehler-E-Mail erfolgreich an yk@nau.ch gesendet.\n";
            return true;
        } catch (Exception $e) {
            print "Fehler-E-Mail konnte nicht gesendet werden. Fehler: {$mail->ErrorInfo}\n";
            return false;
        }
    }

    function makeCheckElements($text) {
        $elements = array();
        $elements['title'] = $text['title'];
        $elements['internal_title'] = $text['internal_title'];
        $elements['lead'] = $text['lead'];
        $elements['dateline'] = $text['dateline'];
        $elements['image']['lead'] = $text['image']['lead'];
        foreach($text['elements'] as $i => $d) {
            if(isset($d['lead'])) {
                $elements['elements'][$i]['lead'] = $d['lead'];
            }
            if(isset($d['content'])) {
                $elements['elements'][$i]['content'] = $d['content'];
            }
        }      
        return $elements;
    }

    function lektoratWithOpenAI($elements) {
        global $openai_key;
        
        $result = $elements;
        $result['changed'] = array();
        
        // Erstelle Kontext mit Titel und Lead für Entitätenerkennung
        $context = "";
        if(isset($elements['title']) && !empty($elements['title'])) {
            $context .= "Artikel-Titel: " . strip_tags($elements['title']) . "\n";
        }
        if(isset($elements['lead']) && !empty($elements['lead'])) {
            $context .= "Artikel-Lead: " . strip_tags($elements['lead']) . "\n";
        }
        
        // Funktion für einzelne Textelemente
        $checkText = function($text, $fieldName) use ($openai_key, &$result, $context) {
            if(empty($text) || trim($text) == '') {
                return $text;
            }
            
            // Prüfe ob es ein Feld ist, bei dem Artikel weggelassen werden dürfen
            $allowMissingArticles = in_array($fieldName, ['title', 'internal_title', 'lead', 'dateline']);
            $articleNote = $allowMissingArticles ? "\n\nBESONDERHEIT für dieses Feld ($fieldName): Aufgrund der Kürze ist es erlaubt, Artikel (der, die, das, ein, eine) wegzulassen. Das ist KEIN Fehler! Beispiele:\n- 'Mann beisst Hund' ist korrekt (Artikel darf fehlen)\n- 'Polizei sucht Täter' ist korrekt (Artikel darf fehlen)\n- 'Neue Regelung tritt in Kraft' ist korrekt (Artikel darf fehlen)" : "";
            
            // Baue Kontext-Information ein
            $contextNote = !empty($context) ? "\n\n=== ARTIKEL-KONTEXT (für Entitätenerkennung) ===\n" . $context . "\nWICHTIG: Analysiere zuerst den Kontext und identifiziere alle Personen-, Orts- und Firmennamen sowie Markennamen. Diese Namen sind korrekt geschrieben und dürfen NIEMALS verändert werden, auch wenn sie wie Rechtschreibfehler aussehen!\n\nBeispiele:\n- Wenn im Titel 'Masin' als Personenname erscheint, ist 'Masin' im gesamten Artikel korrekt (NICHT zu 'Maschine' ändern!)\n- Wenn 'BärnerBär' im Titel steht, ist dies ein Eigenname (NICHT zu 'Berner Bär' ändern!)\n- Firmennamen, Produktnamen und Personennamen aus dem Kontext sind IMMER korrekt!\n===\n" : "";
            
            $prompt = "Du bist ein Lektor für Schweizer Hochdeutsch. Prüfe den folgenden Text AUSSCHLIESSLICH auf orthographische Fehler (Rechtschreibfehler)." . $contextNote . "\n\nWICHTIG - Korrigiere NUR orthographische Fehler:\n- Tippfehler (z.B. 'htat' zu 'hat', 'ghet' zu 'geht', 'eien' zu 'einen')\n- Falsch geschriebene Wörter (z.B. 'Katastrofe' zu 'Katastrophe', 'Rhythmus' statt 'Rythmus')\n- Gross-/Kleinschreibung bei eindeutigen Fehlern\n\nWICHTIG - Was du NICHT ändern darfst:\n- KEINE grammatikalischen Korrekturen\n- KEINE Änderungen an Verbformen (egal ob Indikativ, Konjunktiv, Präsens, Präteritum)\n- KEINE Änderungen an Satzkonstruktionen\n- KEINE stilistischen Verbesserungen\n- KEINE Umformulierungen\n- KEINE Namen oder Entitäten aus dem Artikel-Kontext oben!" . $articleNote . "\n\nWICHTIG für die Schweizer Rechtschreibung:\n1. Das scharfe ß wird NICHT verwendet! Verwende immer 'ss' statt 'ß'.\n\n2. Umlaute (ä, ö, ü, Ä, Ö, Ü) sind KORREKT und dürfen NICHT ersetzt werden!\n\n3. ALLE HTML-Tags und Attribute müssen EXAKT unverändert bleiben!\n   - Korrigiere NUR den Text ZWISCHEN den Tags, niemals die Tags selbst!\n   - URLs in href, src und anderen Attributen dürfen NICHT verändert werden\n\n4. Text in Anführungszeichen oder Guillemets ist ein ZITAT und darf NIEMALS korrigiert werden!\n   - Zitate in doppelten Anführungszeichen bleiben EXAKT so\n   - Zitate in Guillemets (französische Anführungszeichen) bleiben EXAKT so\n   - Beispiel: Wenn im Text ein Zitat mit Rechtschreibfehler steht, wird dieser NICHT korrigiert!\n\nText:\n" . $text . "\n\nAntworte im JSON-Format:\n{\n  \"corrected_text\": \"der korrigierte Text\",\n  \"changes\": \"Beschreibung der Änderungen oder 'Keine Änderungen' wenn alles korrekt war\"\n}";
            
            $data = array(
                'model' => 'gpt-4o-mini',
                'messages' => array(
                    array(
                        'role' => 'system',
                        'content' => 'Du bist ein professioneller Lektor für Schweizer Hochdeutsch. Du korrigierst AUSSCHLIESSLICH orthographische Fehler (Rechtschreibfehler, Tippfehler). Du darfst KEINE grammatikalischen Korrekturen, keine Änderungen an Verbformen und keine stilistischen Verbesserungen vornehmen! In der Schweiz wird das scharfe ß NICHT verwendet - verwende immer "ss" statt "ß". Umlaute (ä, ö, ü) sind korrekt und dürfen NICHT verändert werden! ALLE HTML-Tags, Attribute und URLs müssen EXAKT unverändert bleiben - korrigiere nur den sichtbaren Text zwischen den Tags! WICHTIG: Schweizer Ortsnamen werden oft mit Kantonskürzel geschrieben (z.B. "Solothurn SO", "Bern BE", "Chur GR") - diese Grossbuchstaben-Kürzel (SO, BE, GR, etc.) dürfen NIEMALS in Kleinbuchstaben umgewandelt werden! Die Stadt "St.Gallen" wird OHNE Leerzeichen geschrieben - "St. Gallen" ist FALSCH! KRITISCH: Text in Anführungszeichen ("...", «...», ‹...›, „...") ist ein ZITAT und darf NIEMALS verändert werden - auch nicht bei Rechtschreibfehlern!'
                    ),
                    array(
                        'role' => 'user',
                        'content' => $prompt
                    )
                ),
                'temperature' => 0.3,
                'response_format' => array('type' => 'json_object')
            );
            
            $ch = curl_init('https://api.openai.com/v1/chat/completions');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Authorization: Bearer ' . $openai_key
            ));
            
            $response = curl_exec($ch);
            $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            
            if($httpcode != 200) {
                print "OpenAI API Fehler für $fieldName: HTTP $httpcode\n";
                return $text;
            }
            
            $response_data = json_decode($response, true);
            
            if(isset($response_data['choices'][0]['message']['content'])) {
                $content = json_decode($response_data['choices'][0]['message']['content'], true);
                
                if($content['changes'] != 'Keine Änderungen' && $content['corrected_text'] != $text) {
                    $correctedText = $content['corrected_text'];
                    $hasInvalidChange = false;
                    $invalidReason = '';
                    
                    // Validierung 1: Prüfe ob scharfes ß hinzugefügt wurde (in der Schweiz verboten!)
                    if(strpos($correctedText, 'ß') !== false) {
                        $hasInvalidChange = true;
                        $invalidReason = "Scharfes ß (ß) wurde hinzugefügt - in der Schweiz nicht erlaubt";
                    }
                    
                    // Validierung 2: Prüfe ob Umlaute fälschlicherweise ersetzt wurden
                    if(!$hasInvalidChange) {
                        $umlautPairs = [
                            'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue',
                            'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue'
                        ];
                        
                        foreach($umlautPairs as $umlaut => $replacement) {
                            if(strpos($text, $umlaut) !== false && strpos($correctedText, $replacement) !== false) {
                                $originalCount = substr_count($text, $umlaut);
                                $correctedUmlautCount = substr_count($correctedText, $umlaut);
                                
                                if($correctedUmlautCount < $originalCount) {
                                    $hasInvalidChange = true;
                                    $invalidReason = "Ungültige Umlaut-Ersetzung ($umlaut → $replacement)";
                                    break;
                                }
                            }
                        }
                    }
                    
                    // Validierung 3: Prüfe ob HTML-Tags oder Attribute verändert wurden
                    if(!$hasInvalidChange) {
                        // Extrahiere alle HTML-Tags aus Original und korrigiertem Text
                        preg_match_all('/<[^>]+>/', $text, $originalTags);
                        preg_match_all('/<[^>]+>/', $correctedText, $correctedTags);
                        
                        // Vergleiche die Tags
                        $originalTagsArray = $originalTags[0];
                        $correctedTagsArray = $correctedTags[0];
                        
                        if($originalTagsArray != $correctedTagsArray) {
                            $hasInvalidChange = true;
                            $invalidReason = "HTML-Tags oder Attribute wurden verändert";
                        }
                        
                        // Zusätzliche Prüfung: Vergleiche die Anzahl der Tags
                        if(count($originalTagsArray) != count($correctedTagsArray)) {
                            $hasInvalidChange = true;
                            $invalidReason = "Anzahl der HTML-Tags wurde verändert";
                        }
                    }
                    
                    // Nur wenn keine ungültige Änderung vorliegt, akzeptiere die Korrektur
                    if($hasInvalidChange) {
                        print "WARNUNG: $invalidReason in $fieldName erkannt. Änderung wird ignoriert.\n";
                        return $text;
                    } else {
                        $result['changed'][] = array(
                            'field' => $fieldName,
                            'original' => $text,
                            'corrected' => $correctedText,
                            'reason' => $content['changes']
                        );
                        return $correctedText;
                    }
                }
            }
            
            return $text;
        };
        
        // Prüfe alle Felder
        if(isset($elements['title'])) {
            $result['title'] = $checkText($elements['title'], 'title');
        }
        
        if(isset($elements['internal_title'])) {
            $result['internal_title'] = $checkText($elements['internal_title'], 'internal_title');
        }
        
        if(isset($elements['lead'])) {
            $result['lead'] = $checkText($elements['lead'], 'lead');
        }
        
        if(isset($elements['dateline'])) {
            $result['dateline'] = $checkText($elements['dateline'], 'dateline');
        }
        
        if(isset($elements['image']['lead'])) {
            $result['image']['lead'] = $checkText($elements['image']['lead'], 'image.lead');
        }
        
        if(isset($elements['elements']) && is_array($elements['elements'])) {
            foreach($elements['elements'] as $i => $element) {
                if(isset($element['lead'])) {
                    $result['elements'][$i]['lead'] = $checkText($element['lead'], "elements[$i].lead");
                }
                if(isset($element['content'])) {
                    $result['elements'][$i]['content'] = $checkText($element['content'], "elements[$i].content");
                }
            }
        }
        
        return $result;
    }

    function applyLektoratToArticle($article, $lektorat) {
        // Übertrage korrigierte Felder zurück ins Article-Array
        if(isset($lektorat['title'])) {
            // wollen wir nie verbessern
            // $article['title'] = $lektorat['title'];
        }
        
        if(isset($lektorat['internal_title'])) {
            // wollen wir nie verbessern
            // $article['internal_title'] = $lektorat['internal_title'];
        }
        
        if(isset($lektorat['lead'])) {
            $article['lead'] = $lektorat['lead'];
        }
        
        if(isset($lektorat['dateline'])) {
            // wollen wir nie verbessern
            // $article['dateline'] = $lektorat['dateline'];
        }
        
        if(isset($lektorat['image']['lead'])) {
            $article['image']['lead'] = $lektorat['image']['lead'];
        }
        
        // Übertrage element-Änderungen
        if(isset($lektorat['elements']) && is_array($lektorat['elements'])) {
            foreach($lektorat['elements'] as $i => $element) {
                if(isset($element['lead'])) {
                    $article['elements'][$i]['lead'] = $element['lead'];
                }
                if(isset($element['content'])) {
                    $article['elements'][$i]['content'] = $element['content'];
                }
            }
        }
        
        return $article;
    }

    function getOpenArticles() {
        global $bearer;
        $url = API_URL . "/admin/copy-edit/home";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer ' . $bearer,
            'Content-Type: application/json'
        ));
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [$response, $httpcode];
    }

    function fetchOpenArticle() {
        global $bearer;
        $url = API_URL . "/admin/copy-edit/articles/fetch";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer ' . $bearer,
            'Content-Type: application/json'
        ));
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [$response, $httpcode];
    }

    function handle422Error($article, $errorResponse) {
        global $bearer;
        
        $maxRetries = 50; // Maximal 50 Versuche
        $retryCount = 0;
        $workingArticle = $article;
        
        while($retryCount < $maxRetries) {
            $retryCount++;
            
            // Parse Fehlermeldung
            $errorData = json_decode($errorResponse, true);
            
            if(!isset($errorData['errors']) || empty($errorData['errors'])) {
                print "Keine parsbare Fehlermeldung - breche ab.\n";
                return false;
            }
            
            // Extrahiere ersten Fehler-Pfad (z.B. "elements.8.images.4.lead")
            $errorKeys = array_keys($errorData['errors']);
            $errorPath = $errorKeys[0];
            $errorMessage = is_array($errorData['errors'][$errorPath]) ? $errorData['errors'][$errorPath][0] : $errorData['errors'][$errorPath];
            
            print "Retry #$retryCount: Entferne problematisches Element: $errorPath\n";
            print "Fehlermeldung: $errorMessage\n";
            
            // Parse Pfad (z.B. "elements.8.images.4.lead" -> ["elements", 8, "images", 4, "lead"])
            $pathParts = [];
            preg_match_all('/(\w+)|(\d+)/', $errorPath, $matches);
            foreach($matches[0] as $part) {
                $pathParts[] = is_numeric($part) ? (int)$part : $part;
            }
            
            // Entferne das problematische Element
            if(!removeElementByPath($workingArticle, $pathParts)) {
                print "Konnte Element nicht entfernen - breche ab.\n";
                return false;
            }
            
            // Prüfe ob noch Elemente übrig sind
            if(isArticleEmpty($workingArticle)) {
                print "Alle Elemente wurden entfernt - Artikel kann nicht gespeichert werden.\n";
                return false;
            }
            
            // Versuche erneut zu speichern
            $retryUpdate = postUpdateArticle($workingArticle);
            print "Retry Update Antwort: " . $retryUpdate[0] . " (HTTP Code: " . $retryUpdate[1] . ")\n";
            
            if($retryUpdate[1] == 204 || $retryUpdate[1] == 200) {
                print "Artikel erfolgreich gespeichert nach $retryCount Versuchen.\n";
                return true;
            } else if($retryUpdate[1] == 422) {
                // Nächster Fehler - aktualisiere errorResponse und versuche erneut
                $errorResponse = $retryUpdate[0];
                continue;
            } else {
                print "Unerwarteter Fehler (HTTP {$retryUpdate[1]}) - breche ab.\n";
                return false;
            }
        }
        
        print "Maximale Anzahl Retries ($maxRetries) erreicht - breche ab.\n";
        return false;
    }
    
    function removeElementByPath(&$array, $path) {
        if(empty($path)) {
            return false;
        }
        
        // Navigiere zum vorletzten Element
        $current = &$array;
        $pathLength = count($path);
        
        for($i = 0; $i < $pathLength - 1; $i++) {
            $key = $path[$i];
            
            if(!isset($current[$key])) {
                print "Pfad-Element '$key' existiert nicht.\n";
                return false;
            }
            
            $current = &$current[$key];
        }
        
        // Entferne das letzte Element
        $lastKey = $path[$pathLength - 1];
        
        if(isset($current[$lastKey])) {
            unset($current[$lastKey]);
            print "Element entfernt: " . implode('.', $path) . "\n";
            return true;
        } else {
            print "Letztes Element '$lastKey' existiert nicht.\n";
            return false;
        }
    }
    
    function isArticleEmpty($article) {
        // Prüfe ob noch relevante Inhalte vorhanden sind
        if(empty($article['title']) && empty($article['lead'])) {
            return true;
        }
        
        if(isset($article['elements']) && !empty($article['elements'])) {
            return false;
        }
        
        return true;
    }

    function postUpdateArticle($article) {
        global $bearer;
        $url = API_URL . "/admin/copy-edit/articles/complete";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer ' . $bearer,
            'Content-Type: application/json'
        ));
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($article));
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [$response, $httpcode];
    }

?>