<?php

	$redis = new \Redis();
	$redis_host = "localhost";

	$api = "https://api.nau.ch";
	define('API_URL', $api);
	$bearer = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uYXUuY2gvdG9rZW4iLCJpYXQiOjE1Mzc3ODM1MzksImV4cCI6MjU2OTMxOTUzOSwibmJmIjoxNTM3NzgzNTM5LCJqdGkiOiJuSm9RejNUT21ickhXRm5IIiwic3ViIjo4MDQsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.hXPNxqdKwHZ4g-t4q1BaZMPmwSuUyo1kKXEjEl6OwgQ";
		
	$checkComments = getOpenCommentsFromAPI();

	/*
	// for testeing
	$article_id = 66768781;
	$checkComments = getAllCommentsFromAPI($article_id);

	// moderation test
	
	foreach($checkComments as $c) {
		$comment = $c['content'];
		$status = $c['status'];
		if($status == "approval") continue;
		//print $status . "\n";
		//print_r($c);die;
		//print "Check :" . $comment . "\n";
		$start = time();
		if(maderationCallGPT($comment)) {
			// gpt mod disagree
			if($status == "published") {
				$diff = time() - $start;
				print $comment . "\n";
				print $diff . "s GPT MOD DISAGREE\n";
			}

		} else {
			// gpt mod agree
			if($status == "declined") {
				$diff = time() - $start;
				print $comment . "\n";
				print $diff . "s GPT MOD AGREE\n";
			}
		}
	}
	die;
	*/	

	// $checkComments = getCommentsMarkedFromAPI();
	
	$comments = array();

	$forbidden_words = array("regeN", "Rowena", "rowena", "Row3na","Niger","Goebel", "goebel", "Butler");

	// Verena E Brunschweiger, Mirjam Walser, Daniel Koch, Klimastreik Schweiz, Sam Urech, Rolf Knie, Tamy Glauser, Alexandra Lüönd, Clarita Kunz, Hakan Yakin, Raimondo Ponte, Erni Maissen, Lars Lunde, Meret Schneider, Patrick Hässig, Heinz Theiler, Thomas Matter, Christina Bachmann-roth, Hans-ulrich Bigler, Ueli Schmezer
	$kolumnisten_array = array(331558,261036,283525,331560,331601,34429,8154,331637,291439,331485,297843,75064,329606,332489,269772,251597,331724,241228,328016,333079,284262);
	
	$slots = 20;
	
	/*
	$kriterien = [
		1 => "1: Ist der Kommentar sehr stark beleidigend?",
		//2 => "2: Könnte der Kommentar niveaulos sein?",
		2 => "2: Geht es im Kommentar um scheissen,stuhlen oder abkoten?", // deaktiviert früher, 1.2.24 scheissen eingefügt
		3 => "3: Könnte sich der Kommentar gegen Flüchtlinge richten oder niveaulos gegen Nemo sein?",
		4 => "4: Könnte der Kommentar problematische Begriffe, Anspielungen oder Aussagen enthalten, die rassistisch oder extremistisch konnotiert sind?",
		5 => "5: Könnte der Kommentar negative Aussagen gegenüber Frauen oder Schwulen enthalten?", 
		6 => "6: Ist der Kommentar nicht in Deutsch geschrieben oder handelt es sich um ein Rezept oder eine Produktebeschreibung?",
		//6 => "6: Könnte der Kommentar Begriffe aus dem Nationalsozialismus enthalten?", // deaktiviert, da konsolidiert mit 7
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen?", // deaktviert 2.mai 2024, konsolodiert mit 6
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		// 7 => "7: Könnte der Kommentar um das Thema Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		7 => "7: Könnte der Kommentar Begriffe aus dem Nationalsozialismus enthalten?",
		8 => "8: Enthält der Kommentar eine Adressangabe?",
		// 9 => "9: Geht es im Kommentar um einen Verfasser des Artikels oder wird er benannt?",
		//9 => "Kriterium 9: Wird ein Redaktor des Artikels beleidigt?"
		//9 => "Kriterium 9: Enthält der Kommentar eine URL?"
	//	9 => "Kriterium 9: Könnte der Kommentar von einem Verschwörungstheoretiker verfasst worden sein?"
	];
	*/

	// neue kriterien ab 01.09.2025
	$kriterien = [

		1 => "1: Enthält der Kommentar negative oder stereotypische Aussagen gegenüber Frauen oder Männern aufgrund ihres Geschlechts? Enthält er spezifische, anerkannte sexistische Begriffe? Werden Menschen sexualisiert oder macht der Kommentar Anspielungen auf sexuelle Handlungen oder Körperteile?",
		2 => "2: Enthält der Kommentar negative oder stereotypische Aussagen bezüglich der sexuellen Orientierung einer oder mehrerer Personen? Enthält er spezifische, anerkannte homophobe Begriffe?",
		3 => "3: Enthält der Kommentar negative oder stereotypische Aussagen bezüglich der sexuellen Identität einer oder mehrerer Personen? Enthält er spezifische, anerkannte queerfeindliche Begriffe?",
		4 => "4: Enthält der Kommentar negative oder stereotypische Aussagen bezüglich Herkunft, Hautfarbe, Aussehen oder Religion einer oder mehrerer Personen? Enthält er spezifische, anerkannte rassistische Begriffe oder Tiervergleiche? Besonders “Neger” und alle Ableitungen, Umkehrungen und Übersetzungen davon sind streng verboten. Das Wort “Regen” ist nur in klarem Zusammenhang mit Wetter erlaubt, denn es kann eine Umkehrung von “Neger” sein und ist in diesem Fall streng verboten.",
		5 => "5: Enthält der Kommentar negative oder stereotypische Aussagen über Ausländer, Migranten oder Geflüchtete? Enthält er spezifische, anerkannte xenophobe Begriffe?",
		6 => "6: Enthält der Kommentar nationalsozialistisches Gedankengut, Begriffe oder Zahlenfolgen?",
		7 => "7: Enthält der Kommentar beleidigende Aussagen gegen eine oder mehrere Personen, inklusive dem Verfasser oder der Verfasserin des Artikels beziehungsweise einem Experten oder einer Expertin? Sachlich formulierte, nicht-beleidigende Kritik ist ausdrücklich erlaubt, vor allem gegenüber Organisationen.",
		8 => "8: Enthält der Kommentar negative oder stereotypische Aussagen bezüglich körperlich oder psychisch beeinträchtigten Personen? Enthält er spezifische, anerkannte ableistische Begriffe?",
		9 => "9: Geht es im Kommentar um scheissen, stuhlen oder abkoten?",
		10 => "10: Enthält der Kommentar eine Adressangabe?",
		11 => "11: Ist der Kommentar nicht in Deutsch geschrieben oder handelt es sich um ein Rezept oder eine Produktbeschreibung?",
		12 => "12: Verherrlicht der Kommentar Gewalt oder ruft er zu gewalttätigen Akten auf?",
	];

	$kriterien_kolumnisten = [
		1 => "1: Könnte der Kommentar beleidigend sein?",
		//2 => "2: Könnte der Kommentar niveaulos sein?",
		2 => "2: Geht es im Kommentar um scheissen,stuhlen oder abkoten?", // deaktiviert früher, 1.2.24 scheissen eingefügt
		3 => "3: Könnte sich der Kommentar gegen Flüchtlinge richten oder niveaulos gegen Nemo sein?",
		4 => "4: Könnte der Kommentar problematische Begriffe, Anspielungen oder Aussagen enthalten, die rassistisch oder extremistisch konnotiert sind?",
		5 => "5: Könnte der Kommentar negative Aussagen gegenüber Frauen oder Schwulen enthalten?", 
		6 => "6: Ist der Kommentar nicht in Deutsch geschrieben oder handelt es sich um ein Rezept oder eine Produktebeschreibung?",
		//6 => "6: Könnte der Kommentar Begriffe aus dem Nationalsozialismus enthalten?", // deaktiviert, da konsolidiert mit 7
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen?", // deaktviert 2.mai 2024, konsolodiert mit 6
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		// 7 => "7: Könnte der Kommentar um das Thema Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		7 => "7: Könnte der Kommentar Begriffe aus dem Nationalsozialismus enthalten?",
		8 => "8: Enthält der Kommentar eine Adressangabe?",
		// 9 => "9: Geht es im Kommentar um einen Verfasser des Artikels oder wird er benannt?",
		9 => "Kriterium 9: Wird ein Redaktor des Artikels beleidigt?"
		//9 => "Kriterium 9: Enthält der Kommentar eine URL?"
	//	9 => "Kriterium 9: Könnte der Kommentar von einem Verschwörungstheoretiker verfasst worden sein?"
	];

	$kriterien_verifiziert = [
		1 => "1: Enthält der Kommentar eine schwerwiegende Beleidigung?",
		//2 => "9: Geht es im Kommentar um den Author des Artikels?",
	];

	// test check all
/*
	$kriterien_verifiziert = [
		1 => "1: Könnte der Kommentar beleidigend sein?",
		//2 => "2: Könnte der Kommentar niveaulos sein?",
		2 => "2: Geht es im Kommentar um scheissen,stuhlen oder abkoten?", // deaktiviert früher, 1.2.24 scheissen eingefügt
		3 => "3: Könnte sich der Kommentar gegen Flüchtlinge richten oder niveaulos gegen Nemo sein?",
		4 => "4: Könnte der Kommentar problematische Begriffe, Anspielungen oder Aussagen enthalten, die rassistisch oder extremistisch konnotiert sind?",
		5 => "5: Könnte der Kommentar negative Aussagen gegenüber Frauen oder Schwulen enthalten?", 
		6 => "6: Ist der Kommentar nicht in Deutsch geschrieben oder handelt es sich um ein Rezept oder eine Produktebeschreibung?",
		//6 => "6: Könnte der Kommentar Begriffe aus dem Nationalsozialismus enthalten?", // deaktiviert, da konsolidiert mit 7
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen?", // deaktviert 2.mai 2024, konsolodiert mit 6
		//7 => "7: Könnte der Kommentar russische Propaganda verbreiten, um das Thema Corona oder Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		7 => "7: Könnte der Kommentar um das Thema Zombies gehen oder Begriffe aus dem Nationalsozialismus enthalten?",
		8 => "8: Enthält der Kommentar eine Adressangabe?",
		9 => "9: Geht es im Kommentar um einen Verfasser des Artikels oder wird er benannt?",
		10 => "10: Wird das Wort Spiele erwähnt?",
		//9 => "Kriterium 9: Wird ein Redaktor des Artikels beleidigt?"
		//9 => "Kriterium 9: Enthält der Kommentar eine URL?"
	//	9 => "Kriterium 9: Könnte der Kommentar von einem Verschwörungstheoretiker verfasst worden sein?"
	];
*/	
	
	/* OLD
	$kriterien = [
		1 => "Kriterium 1: Beinhaltet der Kommentar rassitische Inhalte?",
		2 => "Kriterium 2: Hat der Kommentar Andeutungen von Hetze?",
		3 => "Kriterium 3: Beinhaltet der Kommentar Aussagen von Sexismus?",
		4 => "Kriterium 4: Beleidigt der Kommentar in irgend einer Weise eine private Person oder Personengruppe?",
		5 => "Kriterium 5: Schürt der Kommentar in irgend einer Form Angst vor Überfremdung in der Schweiz oder Europa?",
		6 => "Kriterium 6: Verwendet der Kommentar Begriffe aus dem Nationalsozialismus?", 
		7 => "Kriterium 7: Verbreitet dieser Kommentar in irgend einer Form russische Propaganda?"
	];
	*/
	
	/* 
		------------ 
	*/
	$auto_check_data = array();
	$children = array();
	print "\r".date("H:i:s") . " checkComments:" . count($checkComments);
	//print_r($checkComments);die;
	if(count($checkComments) > 0) {
		$start = time();
		unset($auto_check_data);
		unset($children);
		$max = count($checkComments);
		$take = $slots;
		if($max < $slots) $take = $max;
		for($x=1;$x<=$take;$x++) {
			$auto_check_data[] = array_shift($checkComments);
		}
		print "\r".date("H:i:s")  . " " . $max .  "/" . count($auto_check_data) . " DIFF: ";
		
		foreach($auto_check_data as $l) {
			$pid = pcntl_fork();
			if($pid == -1) {
			// Error handling for failed fork
			die('Could not fork PIDs');
			} elseif ($pid) {
			// Parent process
			$children[] = $pid;
			} else {
				// Child process // here everything starts with comment
				set_time_limit(60);
				$text = $l['content'];
				if(strlen($text) > 350) {
					$md5text = md5(substr($text,20,320));
				} else {
					$md5text = md5($text);
				}
				
				//$text = "Ihr seid doch alle Arschlöcher....";
				$author = $l['author']['name'];
				$verified = $l['author']['verified'];
				$session_id = $l['author']['session_id'];
				$redaktoren = array();
				$i=0;

				$take_koluminsten = 0;
				foreach($l['article']['authors'] as $red) {
					$red_id = $red['id'];
					//print_r($red);
					if(in_array($red_id,$kolumnisten_array)) {
						$take_koluminsten = 1;
					}
					$redaktoren[] = $red['name'];
					$i++;
				}
				//$redaktoren[] = "DiVa";
				//$i++;
				if($i > 1) {
					$redaktoren_question = "Die Verfasser des Artikels heissen ". implode(" und ",$redaktoren);
				} else {
					$redaktoren_question = "Der Verfasser des Artikels heisst ". implode(" und ",$redaktoren);
				}
				
				//print_r($l);
				
				$c_id = $l['id'];		
				$feedback = "/home/live/ftp/www/yk/tools/comments/feedback-gpt4o/".$c_id.".json";
				if(!file_exists($feedback)) {
					$redis->connect($redis_host);
					$other_reason = 0;
					// check if tehre is a same contentwithin last 300 seconds
					$sess_key = "content:md5:".$md5text;

					/*
					if($redis->exists($sess_key)) {
						//print "SESSION GEFUDNE?\n";
						$md5_object = json_decode($redis->get($sess_key), true);
						$affected_ids = $md5_object;
						$md5_object[] = $c_id;
						$redis->setex($sess_key, 300, json_encode($md5_object));
						if(count($md5_object) > 2) {
							//print $l['content'] . "\nabgelehnt, gleicher text gefunden\n";
							$other_reason = 1;
							$comments[$c_id]['gpt']['score']['points'] = 1;
							$comments[$c_id]['gpt']['score']['first_reason'] = 18;
							// decline ids before
							foreach($affected_ids as $aid) {
								unpublish($aid,18);
							}
						}
					} else {
						//print "IST ES DA??\n";
						$md5_object = array();
						$md5_object[] = $c_id;
						$redis->setex($sess_key, 300, json_encode($md5_object));
					}
					$redis->close();
					*/
					// new way
					if($redis->exists($sess_key)) {
						$other_reason = 1;
						$comments[$c_id]['gpt']['score']['points'] = 1;
						$comments[$c_id]['gpt']['score']['first_reason'] = 18;
						print "\r".$l['content'] . " abgelehnt, gleicher text gefunden";
						$redis->close();
						file_put_contents($feedback, json_encode($comments[$c_id]['gpt']));
						exit();
					} else {
						$redis->setex($sess_key, 3600, 1);
					}

					$other = grabDataComment($l);
					foreach($other as $o) {
						/*
						if($o['status'] != "published") {
							continue;
						}
						*/
						if($o['content'] == $l['content']) {
							if($o['id'] != $l['id']) {
								// match , gleicher text, kein mehrwert
								$comments[$c_id]['gpt']['score']['points'] = 1;
								$comments[$c_id]['gpt']['score']['first_reason'] = 18;
								$other_reason = 1;
								//print $l['content'] . "\nabgelehnt, gleicher text gefunden\n";
							}
						}
					}
					if(str_word_count($l['content']) < 4) {
						$other_reason = 1;
						print "\r".$l['content'] . " abgelehnt, text zu kurz";
						$comments[$c_id]['gpt']['score']['points'] = 1;
						$comments[$c_id]['gpt']['score']['first_reason'] = 19;
					}

					// generate ratio amount of words / amount of lines
					$words_ratio = str_word_count($l['content']);
					$lines_ratio = substr_count($l['content'],"\n");
					if($lines_ratio < 1) $lines_ratio = 1;
					$ratio_words_lines = $words_ratio / $lines_ratio;
					if($ratio_words_lines < 4) {
						$other_reason = 1;
						print "\r".$l['content'] . " abgelehnt, ratio zu klein";
						$comments[$c_id]['gpt']['score']['points'] = 1;
						$comments[$c_id]['gpt']['score']['first_reason'] = 19;
					}
					$all_words = str_word_count($l['content'],1);
					$diff_words = count(array_unique($all_words));
					if($words_ratio > 0) {
						$ratio_2 = $diff_words / $words_ratio;
						if($ratio_2 < 0.4) {
							$other_reason = 1;
							print "\r".$l['content'] . " abgelehnt, ratio 2 zu klein";
							$comments[$c_id]['gpt']['score']['points'] = 1;
							$comments[$c_id]['gpt']['score']['first_reason'] = 19;
						}
					}
					
					// check the fobidden words if they match in $text
					foreach($forbidden_words as $f) {
						if(strpos($text, $f) !== false) {
							$other_reason = 1;
							print "\r".$l['content'] . " abgelehnt, ".$f." gefunden";
							$comments[$c_id]['gpt']['score']['points'] = 1;
							$comments[$c_id]['gpt']['score']['first_reason'] = 20;
						}
					}
					/*
					if(checkCommentRepeatingContent($l['content'])) {
						$other_reason = 1;
						print "\r".$l['content'] . " abgelehnt, worter zu gleich";
						$comments[$c_id]['gpt']['score']['points'] = 1;
					}
					*/
					if(url_in_string($l['content'])) {
						$other_reason = 1;
						print "\r".$l['content'] . " abgelehnt, URL gefunden";
						$comments[$c_id]['gpt']['score']['points'] = 1;
						$comments[$c_id]['gpt']['score']['first_reason'] = 100;
					}
					/*
					if($verified) {
						$other_reason = 1;
						$comments[$c_id]['gpt']['score']['points'] = 0;
						$comments[$c_id]['gpt']['score']['verified'] = 1;					
						print "\n".$l['content'] . " angenommen, da user verified";	
					}
					*/
					
					if($other_reason < 1)	{
						$comments[$c_id]['gpt'] = generateGPT($author,$text,$feedback,$verified,$redaktoren,$take_koluminsten);
					}
					//print_r($comments[$c_id]['gpt']);
					$redis->close();
					file_put_contents($feedback, json_encode($comments[$c_id]['gpt']));
				}
				exit();
			}
		}
		foreach($children as $child) {
			//print "\n waiting for pid: " . $child;
			pcntl_waitpid($child, $status);
		}
		$diff = time() - $start;
		print "\n\t\t000000000000000000".$diff;
	}
	
	
	/* functions */

	function unpublish($id, $reason = 3) {
		print "\rnau api call '".$id."' decline";
		$data = [
		  "decline_reason_id" => $reason,
		];
		$return = callApi("put","/comments/".$id."/decline",$data);
		//sleep(1);
	}

	
	function grabDataComment($c) {
		$other = array();
		if(isset($c['article']['id'])) {
			$other = getAllCommentsFromArticle($c['article']['id'],$c['id']);
		}		
		return $other;
	}
	
	function getAllCommentsFromArticle($aid,$cid) {
		global $redis;
		$redis->connect("localhost");
		$key = "comments:article:".$aid;
		if($redis->exists($key)) {
			return json_decode($redis->get($key),true);
		} else {
			$return_json = json_decode(callApi("get","/comments?page=1&article_id=".$aid), true);
			if(!isset($return_json['meta']['last_page'])) {
				exit();
			}	
			$total_pages = $return_json['meta']['last_page'];
			$auto_check_data = $return_json['data'];
			if($total_pages > 1) {				
				for($x=2;$x<=$total_pages;$x++) {
					$return_json2 = json_decode(callApi("get","/comments?page=".$x."&article_id=".$aid), true);
					//print_r($return_json2);
					foreach($return_json2['data'] as $add) {
						$auto_check_data[] = $add;
					}
				}
			}	
			$redis->setex($key, 20, json_encode($auto_check_data));
			return $auto_check_data;	
		}	
	}

 	function checkCommentRepeatingContent($c) {
 		$data = explode(" ",$c);
 		$tot_words = 0;
 		$list = array();
 		foreach($data as $w) {
 			if(isset($list[$w])) $list[$w]++;
 			else $list[$w] = 1;
 			$tot_words++;
 		}
 		$ratio = count($list)/$tot_words;
 		if($ratio < 0.9) return 1;
 		return 0;
 	}	
	
	function generateGPT($author,$text,$feedback,$verified = 0,$redaktoren, $use_kolumnisten = 0) {
		global $kriterien,$kriterien_verifiziert, $kriterien_kolumnisten;
		if($verified) {
			$use_kriterien = $kriterien_verifiziert;
		} else {
			$use_kriterien = $kriterien;
		}
		if($use_kolumnisten) {
			$use_kriterien = $kriterien_kolumnisten;
		}
		$start = time();
		$ret = json_decode(makeGPTCall($author,$text,$verified,$redaktoren),true);
		$used_secs = time() - $start;
		if(!isset($ret['choices'][0]['message']['content'])) return false;
		$k = strtolower($ret['choices'][0]['message']['content']);
		$answer = json_decode($k,true);
		$rating = array();
		foreach($answer as $i => $k) {
				unset($rating);
				if(strtolower($k) == "ja") {
						$rating = [
								"rating" => "Ja",
								"why" => "Aktuell keine Begründung möglich",
								"qn" => (int) $i
						];
				} else {
						$rating = [
								"rating" => "Nein",
								"why" => "Aktuell keine Begründung möglich",
								"qn" => (int) $i
						];
				}
				$arr[$i] = $rating;
		}
		$arr['score'] = rateIT($arr);
		//print "\n".$arr['score']['points'] . ": ".$text."\n";
		if($arr['score']['points'] > 0) {
			foreach($arr['score']['reasons'] as $r) {
				$take_r = $r;
				if($r > 20) $take_r = $r - 20;
				$arr['score']['reasons_readable'][$r] = $use_kriterien[$take_r];
			}
		}
		$arr['score']['input'] = "Author: ".$author."; Kommentar: ".$text;
		$arr['score']['gpt_time'] = $used_secs;
		//$arr['score']['gpt_comment'] = $ret['choices'][0]['message']['content'];
		return $arr;
	}
	
	function rateIT($a) {
		$soft = 0;
		$hard = 0;
		$reasons = array();
		$answers = array();
		$first_reason = 0;
		foreach($a as $in => $val) {
			if(isset($val['rating'])) {
				$trynum = $val['qn'];
				if($trynum > 0) {
					$in = $trynum + 20;
				}
				$ret = $val['rating'];
				if(strstr($ret, "Ja") || strstr($ret, "Möglicherweise")) {
					$reasons[] = $in;
					$answers[$in] = $val['why'];
					if($in > 20 && $first_reason < 1) {
						$first_reason = $in;
					}
					$hard += 1;	
				}
			}
			
		}
		$return = $hard + $soft;
		$ret = array();
		$ret['points'] = $return;
		$ret['reasons'] = $reasons;
		$ret['answers'] = $answers;
		$ret['first_reason'] = $first_reason;
		return $ret;
	}

	function getCommentsMarkedFromAPI() {
		$return_json = json_decode(callApi("get","/comments?page=1&reported=1"), true);
		$auto_check_data = $return_json['data'];
		return $auto_check_data;
	}

	function getAllCommentsFromAPI($aid) {
		// get comments
		$return_json = json_decode(callApi("get","/comments?page=1&article_id=".$aid), true);
		if(!isset($return_json['meta']['last_page'])) {
			exit();
		}	
		$total_pages = $return_json['meta']['last_page'];
		if($total_pages > 1) {
			$auto_check_data = $return_json['data'];
			for($x=2;$x<=$total_pages;$x++) {
				$return_json2 = json_decode(callApi("get","/comments?page=".$x."&article_id=".$aid), true);
				foreach($return_json2['data'] as $add) {
					$auto_check_data[] = $add;
				}
			}
		} else {
			$auto_check_data = $return_json['data'];
		}		
		return $auto_check_data;		
	}
	
	function getOpenCommentsFromAPI() {
		// get comments
		$return_json = json_decode(callApi("get","/comments?page=1&status=approval"), true);
		if(!isset($return_json['meta']['last_page'])) {
			exit();
		}	
		$total_pages = $return_json['meta']['last_page'];
		if($total_pages > 1) {
			$auto_check_data = $return_json['data'];
			for($x=2;$x<=$total_pages;$x++) {
				$return_json2 = json_decode(callApi("get","/comments?page=".$x."&status=approval"), true);
				foreach($return_json2['data'] as $add) {
					$auto_check_data[] = $add;
				}
			}
		} else {
			$auto_check_data = $return_json['data'];
		}		
		return $auto_check_data;		
	}
	
	function url_in_string($string) {
	    $regex = "/\b(?:https?:\/\/|www\.)[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/i";
	    if(preg_match($regex, $string, $url)) {
	       return true; // URL gefunden
	    }
	    return false; // keine URL gefunden
	}

	function makeGPTCall($author,$text,$verified,$redaktoren) {
		global $kriterien,$redaktoren_question,$kriterien_verifiziert;
		if($verified) {
			$use_kriterien = $kriterien_verifiziert;
		} else {
			$use_kriterien = $kriterien;
		}
		/*
		foreach($use_kriterien as $k => $v) {
			//print "$v \n";
			if(strpos(strtolower($v), "verfasser")) {
				$trash = explode(":",$v);

				$verf_liste = implode(" oder ",$redaktoren);
				$use_kriterien[$k] = $trash[0] . ": Geht es im Kommentar offensichtlich um '".$verf_liste . "'?";
			}
		}
		*/
		$ident = rand();
		$bearer = "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";
		$curl = curl_init();
		$url = "https://api.openai.com/v1/chat/completions";
		//print $redaktoren_question . "\n";
		// "model" => "gpt-3.5-turbo-0301",
		$data = [
	    // "model" => "gpt-4o",
		"model" => "gpt-4o-mini",
		// "model" => "gpt-4-turbo-preview",
		"response_format" => [
			"type" => "json_object",
		],
	    "messages" => [
        [
            "role" => "system",
            "content" => "Du verifizierst Kommentare von Benutzer auf einer Nachrichtenwebseite und bestimmst, ob diese dem Regelwerk entsprechen oder nicht. Die Kommentare sind an einen Artikel angehängt, welcher von einem oder mehreren Authoren geschrieben wurden."
        ],
		[
            "role" => "user",
            "content" => $redaktoren_question
        ], 
        [
            "role" => "user",
            	"content" => "Ein Kommentar ist ein beliebiger Text, welcher durch einen Benutzer erfasst und eingeschickt wird.",
//            "content" => "Ein Kommentar ist ein beliebiger Text, welcher durch einen Benutzer erfasst und eingeschickt wird. Die Bewertung der Kriterien erfolgt immer auf einer Skala von 1 bis 5. 1 steht für trifft gar nicht zu. 2 steht für trifft ein wenig zu, 3 steht für trifft so halb zu, 4 steht für trifft eher zu und 5 steht für trifft voll zu."
//            "content" => "Ein Kommentar ist ein beliebiger Text, welcher durch einen Benutzer erfasst und eingeschickt wird. Die Bewertung der Kriterien erfolgt immer auf einer Skala von 1 bis 10. Kleiner steht für trifft absolut nicht zu und grösser steht für trifft exakt zu"
        ],
        [
            "role" => "assistant",
            "content" => "Verstehe. Sende mir den Kommentar, den du bewerten möchtest."
        ],
        [
            "role" => "user",
            "content" => "Kommentar: ".$text
        ],
        [
            "role" => "user",
            //"content" => "Bewerte den Kommentar bitte mit folgenden Kriterien: Kriterium 1: Ist der Kommentar rassistisch? Kriterium 2: beleidigt der Kommentar direkt einen Menschen oder eine Personengruppe? Kriterium 3: Ist der Kommentar sexistisch? Kriterium 4: Verbreitet der Kommentar eine gängige Verschwörungstheorie? Kriterium 5: Verbreitet dieser Kommentar russische Propaganda? Kriterium 6: Verbreitet der Kommentar Hetze? Kriterium 7: Schürt der Kommentar Angst vor Überfremdung in der Schweiz oder Europa? Kriterium 8: Wertet der Kommentar Frauen ab? Kriterium 9: Erwähnt der Kommentar Begriffe aus dem Nationalsozialismus? Kriterium 10: Wirkt der Author wie ein richtiger Name? Kriterium 11: Ist dieser Kommentar mehrwertig für eine andere Person? Kriterium 12: Wie gut verstehst du den Kommentar?"
        		"content" => "Bewerte die Kommentare in dieser Reihenfolge mit folgenden Kriterien. Sei streng: ".implode(" ",$use_kriterien)
        ],
        [
            "role" => "user",
            "content" => "Antworte als JSON Objekt, welches direkt mit PHP gelesen werden kann. Jede Frage hat eine Nummer. Für die Antwort stelle im Antwortobjekt diese Nummer als Index und mit dem Wert der entsprechenden Bewertung. Die Bewertung ist immer Ja, wenn es stimmt oder Nein, wenn es nicht stimmt. Achte darauf, dass es immer nur das JSON Objekt sein darf und keine weiteren Texte."
        ]
	    ],
	    "max_tokens" => 2000,
	    "temperature" => 0,
	    "top_p" => 1,
	    "frequency_penalty" => 1,
	    "presence_penalty" => 0,
	    "stop" => "None"
	];
	//print_r($data);
	//file_put_contents("/home/live/ftp/www/yk/tools/comments/fullstring/".$ident.".json",json_encode($data));
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
		curl_setopt($curl, CURLOPT_HTTPHEADER, [
		'Content-Type: application/json',
		'Authorization: Bearer '.$bearer]);   
		      
		
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 180);
		$result = curl_exec($curl);
			$result2 = json_decode($result,true);
			$result2['given'] = json_encode($data);
			//print_r($result2['given']);
			$result3 = json_encode($result2);
		curl_close($curl);
		return $result3;
	}

	function maderationCallGPT($comment) {

		$data = [
			"input" => $comment,
		];

		$bearer = "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";
		$curl = curl_init();
		$url = "https://api.openai.com/v1/moderations";
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
		curl_setopt($curl, CURLOPT_HTTPHEADER, [
		'Content-Type: application/json',
		'Authorization: Bearer '.$bearer]);  
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 180);
		$result = curl_exec($curl);
		$result2 = json_decode($result,true);
		curl_close($curl);
		if($result2['results'][0]['flagged'] === true) {
			//print_r($result2['results'][0]);
		}
		return $result2['results'][0]['flagged'];
	}
	
	function callApi($method, $path, $data = [])
	{
			global $bearer;
	    $curl = curl_init();
	    $url = API_URL . $path;

	    switch (strtolower($method)) {
	        case 'post':
	            curl_setopt($curl, CURLOPT_POST, 1);
	            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
	            curl_setopt($curl, CURLOPT_HTTPHEADER, [
	    'Content-Type: application/json',
	    'Authorization: Bearer '.$bearer]);   
	            break;

	        case 'put':
	           // curl_setopt($curl, CURLOPT_PUT, 1);
	            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
	            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
	            curl_setopt($curl, CURLOPT_HTTPHEADER, [
	    'Content-Type: application/json',
	    'Authorization: Bearer '.$bearer]);   
	            break;

	        case 'get':
	            if (!empty($data)) {
	                $url = sprintf("%s?%s", $url, http_build_query($data));
	            }
	            curl_setopt($curl, CURLOPT_HTTPHEADER, [
	    'Content-Type: application/json',
	    'Authorization: Bearer '.$bearer]);   
	            break;

	        case 'delete':
	            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
	            curl_setopt($curl, CURLOPT_HTTPHEADER, [
	    'Content-Type: application/json',
	    'Authorization: Bearer '.$bearer]);            
	            break;
	            
	        default:
	            throw new InvalidArgumentException("Unknown method {$method}");
	    }

	    curl_setopt($curl, CURLOPT_URL, $url);
	    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

	    $result = curl_exec($curl);

	    curl_close($curl);

	    return $result;
	}
	
?>
