<?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);
        $article = removeNotSupportedElementTypes($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 {
            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();
        
        // Funktion für einzelne Textelemente
        $checkText = function($text, $fieldName) use ($openai_key, &$result) {
            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)" : "";
            
            $prompt = "Du bist ein Lektor für Schweizer Hochdeutsch. Prüfe den folgenden Text AUSSCHLIESSLICH auf orthographische Fehler (Rechtschreibfehler).\n\nWICHTIG - Korrigiere NUR orthographische Fehler:\n- Tippfehler (z.B. 'htat' → 'hat', 'ghet' → 'geht', 'eien' → 'einen')\n- Falsch geschriebene Wörter (z.B. 'Katastrofe' → '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" . $articleNote . "\n\nWICHTIG für die Schweizer Rechtschreibung:\n1. Das scharfe ß wird NICHT verwendet! Verwende immer 'ss' statt 'ß'. Beispiele:\n   - 'heißt' → 'heisst'\n   - 'groß' → 'gross'\n   - 'Straße' → 'Strasse'\n   - 'außer' → 'ausser'\n\n2. Umlaute (ä, ö, ü, Ä, Ö, Ü) sind KORREKT und dürfen NICHT ersetzt werden!\n   - 'über' bleibt 'über' (NICHT 'ueber')\n   - 'Ähnliches' bleibt 'Ähnliches' (NICHT 'Aehnliches')\n   - 'Stücke' bleibt 'Stücke' (NICHT 'Stuecke')\n   - 'Zürcher' bleibt 'Zürcher' (NICHT 'Zuercher')\n\n3. ALLE HTML-Tags und Attribute müssen EXAKT unverändert bleiben!\n   - <a href=\"...\">Text</a> → href bleibt unverändert\n   - <h2>Text</h2> → Tags bleiben unverändert\n   - <p class=\"...\">Text</p> → Alle Attribute bleiben unverändert\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\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!'
                    ),
                    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'])) {
            $article['title'] = $lektorat['title'];
        }
        
        if(isset($lektorat['internal_title'])) {
            $article['internal_title'] = $lektorat['internal_title'];
        }
        
        if(isset($lektorat['lead'])) {
            $article['lead'] = $lektorat['lead'];
        }
        
        if(isset($lektorat['dateline'])) {
            $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 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];
    }

?>