<!DOCTYPE html>
<html lang="en">

<head>
  <?php require_once "../../base/meta.php" ?>
  <title>Functions</title>
</head>

<body>
  <?php
  require_once "../../base/settings.php";
  require_once "../../base/headers.php";
  Headers::html();

  /* Aufgabe 1 (A)
Programmieren Sie eine Funktion buildlink,
die aus einem Text und einer Url einen
HTML-Hyperlink zusammensetzt und diesen zurückgibt.*/


  //Hier Funktion 1 implementieren
  $buildlink = fn ($name, $url) => "<a href=\"$url\">$name</a>";


  /*So könnten die Funktionsaufrufe für die Funktion buildlink aussehen.
Beim zweiten Aufruf wird die Rückgabe der Funktion ohne Zwischenvariable direkt mit echo ausgegeben. Die Beispielaufrufe können zum Testen der Funktion verwendet werden.*/
  $ergebnis = $buildlink("Google", "https://www.google.de");
  echo "$ergebnis<br>";
  echo $buildlink("PHP-Doku", "https://www.php.net");


  /* Aufgabe 2 (A)
Programmiere Sie eine Funktion isHexColor, die überprüft, ob ein Wert eine hexadezimale Farbe ist. Die Funktion erhält den Wert als Zeichenkette. Sie soll true zurückgeben, wenn die Zeichenkette eine hexadezimale Farbe ist und sie soll false zurückgeben, wenn die Zeichenkette keine hexadezimale Zahl ist.*/


  //Hier Funktion 2 implementieren
  $isHexColor = fn ($colour) => preg_match("/^#([0-9A-Fa-f]{3,4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/", $colour);


  //So könnten die Funktionsaufrufe für die Funktion isHexColor aussehen.
  //Ändern Sie den Wert #GG000, um die Funktion auch mit anderen Eingaben zu testen.
  $wert = "#GG000"; //#330055
  $ergebnis = $isHexColor($wert);
  if ($ergebnis == true)
    echo "<p>$wert ist eine hexadezimale Farbe</p>";
  else
    echo "<p>$wert ist keine hexadezimale Farbe</p>";


  /* 3 (M)
Programmieren Sie eine Funktion wortzaehler,
die eine Zeichenkette mit einem Satz erhält und die die Anzahl der Wörter im Satz zurückgibt.*/


  //Hier Funktion 3 implementieren
  $wortzaehler = fn ($sentence) => count(explode(" ", $sentence));



  /*So könnten ein Funktionsaufruf für die Funktion wortzaehler aussehen. Die Rückgabe der Funktion wird in der Variablen $ergebnis gespeichert und anschließend mit einem echo ausgegeben.
Der Beispielaufruf kann zum Testen der Funktion verwendet werden.*/
  $satz = "Das ist das Haus vom Nikolaus";
  $ergebnis = $wortzaehler($satz);
  echo "<p>Der Satz <b>$satz</b> hat $ergebnis Wörter</p>"; //6 Wörter





  /*Aufgabe 4 (F)
Implementieren Sie mithilfe von zwei Funktionen: addHit und getHits  einen einfachen Zugriffszähler.
Die Funktion addHit soll eine Zahl in einer Datei um eine Ganzzahl hochzählen.
Die Funktion getHits soll eine Zahl aus einer Datei auslesen und ausgeben.
Details siehe Aufgabenstellung in Blackboard. */

  //Hier Funktion 4 implementieren
  function addHit($file)
  {
    if (!file_exists("./data/$file")) {
      file_put_contents("./data/$file", "1");
      setcookie("counter-visit", "true",  ["expires" => time() + 60 * 60 * 24, "samesite" => "strict", "secure" => true, "httponly" => true]);
      return;
    }

    $f = fopen("./data/$file", "r+");
    if (flock($f, LOCK_EX)) {
      $cnt = intval(fgets($f)) ?? 0;

      if (!isset($_COOKIE["counter-visit"])) {
        rewind($f);
        $cnt += 1;
        fputs($f, strval($cnt));

        setcookie("counter-visit", "true",  ["expires" => time() + 60 * 60 * 24, "samesite" => "strict", "secure" => true, "httponly" => true]);
      }
    }
    flock($f, LOCK_UN);
    fclose($f);
  }

  function getHits($file)
  {
    if (!file_exists("./data/$file"))
      return "<p>Die Seite wurde noch nicht besucht</p>";

    $f = fopen("./data/$file", "r");
    if (flock($f, LOCK_EX)) {
      $cnt = intval(fgets($f)) + 1;
      return "<p>Sie sind der $cnt Besucher</p>";
    }
    flock($f, LOCK_UN);
    fclose($f);
  }

  echo getHits("counter.txt");
  addHit("counter.txt");
  ?>
</body>

</html>