<?php #pgs/xx_termine/class.php

class EinsätzePage extends BasePage
{
  private $monthsback = 1;
  
  protected function update($id) {
    $this->get($id);
    $qry = "UPDATE Einsätze SET Beginn = ?, Ende = ?, Thema = ?, Ort = ?, Dienstplan = ?, "
          ."Kategorie = ?, Platzvergabe = ?, Ausgelost = ?, Gruppe = ? WHERE ID = ?";
    if ($stmt = $this->db->prepare($qry)) {
      $Beginn = $this->man->input["ALARMIERUNGSZEIT"] ?? $this->output["MAIN"]["ALARMIERUNGSZEIT"];
      $Ende = $this->man->input["EINSATZENDE"] ?? $this->output["MAIN"]["EINSATZENDE"];
      $Thema = $this->man->input["THEMA"] ?? $this->output["MAIN"]["THEMA"];
      $Ort = $this->man->input["ORT"] ?? $this->output["MAIN"]["ORT"];
      $Dienstplan = $this->man->input["DIENSTPLAN"] ?? $this->output["MAIN"]["DIENSTPLAN"]["ID"];
      $Kategorie = $this->man->input["KATEGORIE"] ?? $this->output["MAIN"]["KATEGORIE"]["ID"];
      $Platzvergabe = array_key_exists("PLATZVERGABE", $this->man->input)
                    ? $this->man->input["PLATZVERGABE"]
                    : (is_null($this->output["MAIN"]["PLATZVERGABE"]) ? null : $this->output["MAIN"]["PLATZVERGABE"]["ID"]);
      $Ausgelost = $this->man->input["AUSGELOST"] ?? $this->output["MAIN"]["AUSGELOST"];
      $Gruppe = array_key_exists("GRUPPE", $this->man->input)
                      ? $this->man->input["GRUPPE"]
                      : (is_null($this->output["MAIN"]["GRUPPE"]) ? null : $this->output["MAIN"]["GRUPPE"]["ID"]);
      $stmt->bind_param(
        "ssssiiiiii",
        $Beginn,
        $Ende,
        $Thema,
        $Ort,
        $Dienstplan,
        $Kategorie,
        $Platzvergabe,
        $Ausgelost,
        $Gruppe,
        $id
      );
      if ($stmt->execute()) {
        $this->man->AddMessage("Einsatz wurde aktualisiert!");
        $this->get($id);
        return 200;
      } else {
        $this->man->AddMessage("Mysql error: ".$this->db->error);
      }
    } else {
      $this->man->AddMessage("Mysql error: ".$this->db->error);
    }
    return 500;
  }
  
  protected function insert() {
    $qry = "INSERT INTO Einsätze (Beginn, Ende, Thema, Ort, Dienstplan, Kategorie, Platzvergabe, Gruppe) VALUES (?,?,?,?,?,?,?,?)";
    if ($stmt = $this->db->prepare($qry)) {
      $Beginn = $this->man->input["ALARMIERUNGSZEIT"] ?? "";
      $Ende = $this->man->input["EINSATZENDE"] ?? "";
      $Thema = $this->man->input["THEMA"] ?? "";
      $Ort = $this->man->input["ORT"] ??"";
      $Dienstplan = $this->man->input["DIENSTPLAN"] ?? null;
      $Kategorie = $this->man->input["KATEGORIE"] ?? null;
      $Platzvergabe = array_key_exists("PLATZVERGABE", $this->man->input)
                    ? $this->man->input["PLATZVERGABE"]
                    : null;
      $Gruppe = array_key_exists("GRUPPE", $this->man->input)
                      ? $this->man->input["GRUPPE"]
                      : null;
      $stmt->bind_param(
        "ssssiiii",
        $Beginn,
        $Ende,
        $Thema,
        $Ort,
        $Dienstplan,
        $Kategorie,
        $Platzvergabe,
        $Gruppe
      );
      $stmt->execute();
      if ($stmt->affected_rows==1) {
        $this->man->AddMessage("Einsatz wurde hinzugefügt!");
        $this->get($this->db->insert_id);
        return 201;
      } else {
        $this->man->AddMessage("Einsatz konnte nicht hinzugefügt werden! ("
                              .$Beginn." / ".$Ende." / ".$Thema." / ".$Ort." / "
                              .$Dienstplan." / ".$Kategorie." / ".$Platzvergabe." / ".$Gruppe.")"
        );
        return 400;
      }
    } else {
      $this->man->AddMessage("Mysql error: ".$this->db->error);
      return 500;
    }
  }
    
  protected function get($id = null) {
  	$this->output = [];
    $where = "";
    if ($id) {
      $where = "WHERE e.ID = ? ";
    } else if (sizeof($this->man->Filter())>0) {
      $where = "WHERE 1 ";
      foreach ($this->man->Filter() as $filter) {
        $where.= "or"==$filter["and"] ? "OR " : "AND ";
        if ("none"==$filter["field"]) {
          $where.= "1 ";
        } else {
          switch ($filter["field"]) {
            case "ALARMIERUNGSZEIT":
              $where.= $this->getFilterString($filter["op"], ["<=", ">="], "t", "Beginn", $filter["value"]);
              break;
            case "EINSATZENDE":
              $where.= $this->getFilterString($filter["op"], ["<=", ">="], "t", "Ende", $filter["value"]);
              break;
            case "THEMA":
              $where.= $this->getFilterString($filter["op"], ["like", "not like"], "t", "Thema", $filter["value"]);
              break;
            case "DIENSTPLAN":
              $where.= $this->getFilterString($filter["op"], ["=", "<>"], "t", "Dienstplan", $filter["value"]);
              break;
            case "KATEGORIE":
              $where.= $this->getFilterString($filter["op"], ["=", "<>"], "t", "Kategorie", $filter["value"]);
              break;
            case "GRUPPE":
              $where.= $this->getFilterString($filter["op"], ["=", "<>"], "t", "Gruppe", $filter["value"]);
              break;
            default:
              $where.= "1 ";
      } } }
    } else {
      /*$datefrom = date("Y-m-d H:i:s");
      $this->man->filter[] = ["and" => "and", "field" => "EINSATZENDE", "op" => ">=", "value" => $datefrom];
      $where = "WHERE ".$this->getFilterString(">=", [">="], "t", "Ende", $datefrom);*/
    }
    
    $qry = "SELECT e.ID, e.Alarmierungszeit, e.Einsatzende, e.Adresse, e.Art, e.Zusammenfassung, e.Einsatzleiter, e.Überprüft "
          .", ea.Kategorie, ea.Name eaName, ea.Stichworte "
          .", ek.Name ekName, ek.Farbe "
          ."FROM Einsätze e "
          ."LEFT JOIN Einsätze_Arten ea ON ea.ID=e.Art "
          ."LEFT JOIN Einsätze_Kategorien ek ON ek.ID=ea.Kategorie "
          .$where
          ."ORDER BY e.Alarmierungszeit DESC ";
    if ($stmt = $this->db->prepare($qry)) {
      $userID = $this->man->user->ID();
      if ($id) {
        $stmt->bind_param("i", $id);
      } else {
        //$stmt->bind_param("i", $userID, $userID);
      }
      $stmt->execute();
      $res = $stmt->get_result();
      while ($row = $res->fetch_assoc()) {
        $beginn_time = date("H:i", strtotime($row["Alarmierungszeit"]));
        $ende_time = date("H:i", strtotime($row["Einsatzende"]));
        $beginn_date = date("D, d.m.Y", strtotime($row["Alarmierungszeit"]));
        $ende_date = "0000-00-00 00:00:00"== $row["Einsatzende"] ? 
          "?" : (
          "00:00"==$ende_time ? date("D, d.m.Y", strtotime($row["Einsatzende"]) - 1) : date("D, d.m.Y", strtotime($row["Einsatzende"]))
        );
        
        $entry = [
          "ID" => $row["ID"],
          "MAIN" => [
            "ALARMIERUNGSZEIT" => $row["Alarmierungszeit"],
            "ALARMIERUNGSZEIT.DATUM" => date("D, d.m.Y", strtotime($row["Alarmierungszeit"])),
            "ALARMIERUNGSZEIT.DATE" => date("Y-m-d", strtotime($row["Alarmierungszeit"])),
            "ALARMIERUNGSZEIT.ZEIT" => date("H:i", strtotime($row["Alarmierungszeit"])),
            "ALARMIERUNGSZEIT.TIME" => date("H:i", strtotime($row["Alarmierungszeit"])),
            "EINSATZENDE" => $row["Einsatzende"],
            "EINSATZENDE.DATUM" => date("d.m.Y", strtotime($row["Einsatzende"])),
            "EINSATZENDE.DATE" => date("Y-m-d", strtotime($row["Einsatzende"])),
            "EINSATZENDE.ZEIT" => date("H:i", strtotime($row["Einsatzende"])),
            "EINSATZENDE.TIME" => date("H:i", strtotime($row["Einsatzende"])),
            "DATUM" => $beginn_date.($beginn_date!=$ende_date && "?"!=$ende_date ? " - ".$ende_date : ""),
            "ZEIT" => $beginn_time." - ".("?"==$ende_date ? "?" : $ende_time),
            "ADRESSE" => $row["Adresse"],
            "ART" => [
              "ID" => $row["Art"],
              "KATEGORIE" => ["ID" => $row["Kategorie"], "NAME" => $row["ekName"], "FARBE" => $row["Farbe"]],
              "NAME" => is_null($row["Art"]) ? "Unbekannt" : $row["eaName"],
              "STICHWORTE" => $row["Stichworte"]
            ],
            "ZUSAMMENFASSUNG" => $row["Zusammenfassung"],
            "EINSATZLEITER" => $row["Einsatzleiter"],
            "ÜBERPRÜFT" => $row["Überprüft"],
            "ADMIN" => true,
          ],
          "SUB" => [
            /*"ANMELDUNG" => $registration,
            "TEILNAHME" => $isPrivileged ? $teilnahme : []*/
          ],
        ];
        $group = date("Y", strtotime($row["Alarmierungszeit"]));
        $this->addEntryToOutput($group, $entry, $id);
      }
    } else {
      $this->man->AddMessage("Mysql error: ".$this->db->error);
    }
    
    return 200;
  }
  
  protected function fillOptions($admin = false) {
    $ret = array();
    $res = $this->db->query("SELECT ID, Jahr, Name FROM Termine_Dienstpläne ORDER BY Jahr DESC, Name DESC");
    while ($row = $res->fetch_assoc()) {
      $ret["DIENSTPLAN"][] = ["ID" => $row["ID"], "JAHR" => $row["Jahr"], "NAME" => $row["Name"]];
    }
    $res = $this->db->query("SELECT ID, Name FROM Einsätze_Kategorien");
    while ($row = $res->fetch_assoc()) {
      $ret["KATEGORIE"][] = ["ID" => $row["ID"], "NAME" => $row["Name"]];
    }
    $res = $this->db->query("SELECT ID, Kürzel, Name FROM Struktur_Abteilungen");
    while ($row = $res->fetch_assoc()) {
      $ret["ABTEILUNG"][] = ["ID" => $row["ID"], "KÜRZEL" => $row["Kürzel"], "NAME" => $row["Name"]];
    }
    $ret["PLATZVERGABE"][] = ["ID" => "__NULL__", "NAME" => "Ohne"];
    $res = $this->db->query("SELECT ID, Name FROM Termine_Platzvergaben ORDER BY Name ASC");
    while ($row = $res->fetch_assoc()) {
      $ret["PLATZVERGABE"][] = ["ID" => $row["ID"], "NAME" => $row["Name"]];
    }
    $ret["GRUPPE"][] = ["ID" => "__NULL__", "KÜRZEL" => "Ohne", "NAME" => "Ohne"];
    $res = $this->db->query("SELECT ID, Kürzel, Name FROM Struktur_Gruppen ORDER BY Name ASC");
    while ($row = $res->fetch_assoc()) {
      $ret["GRUPPE"][] = ["ID" => $row["ID"], "KÜRZEL" => $row["Kürzel"], "NAME" => $row["Name"]];
    }
    if ($admin) {
      $res = $this->db->query("SELECT p.ID, Nachnamen, Vornamen, pk.Name pkName FROM Personal p LEFT JOIN Personal_Kategorien pk ON pk.ID=p.Kategorie "
                             ."ORDER BY pk.Reihenfolge ASC, Nachnamen ASC, Vornamen ASC");
      $lastKategorie = "";
      while ($row = $res->fetch_assoc()) {
        if ($row["pkName"]!=$lastKategorie) {
          $ret["TEILNAHME"][] = ["ID" => 0, "NAME" => " === ".$row["pkName"]." === "];
          $lastKategorie = $row["pkName"];
        }
        $ret["TEILNAHME"][] = ["ID" => $row["ID"], "NAME" => preg_replace("/(?<![ -])\p{Ll}+/u", ".", $row["Vornamen"])." ".$row["Nachnamen"]];
    } }
    return $ret;
  }
  
  private function teilnahmeGetAll($terminID) {
    $ret = [];
    $qry = "SELECT p.ID, p.Nachnamen, p.Vornamen, GROUP_CONCAT(l.Kürzel SEPARATOR ', ') lehrgänge, tt.Status "
          ."FROM Einsätze_Teilnahmen tt "
          ."LEFT JOIN Personal p ON p.ID=tt.Personal "
          ."LEFT JOIN Personal_Lehrgänge pl ON pl.Personal=tt.Personal "
          ."LEFT JOIN Lehrgänge l ON l.ID=pl.Lehrgänge "
          ."WHERE tt.Einsätze = ? "
          ."GROUP BY p.ID ORDER BY tt.Status DESC, p.Kategorie DESC, p.Nachnamen ASC, p.Vornamen ASC, l.ID ASC";
    if ($stmt = $this->db->prepare($qry)) {
      $stmt->bind_param("i", $terminID);
      $stmt->execute();
      $res = $stmt->get_result();
      while ($row = $res->fetch_assoc()) {
        $status = $row["Status"]==2 ? "LEAD" : ($row["Status"]==1 ? "CAN" : "WANT");
        $entry = [
          "ID" => $row["ID"],
          "NAME" => preg_replace("/(?<![ -])\p{Ll}+/u", ".", $row["Vornamen"])." ".$row["Nachnamen"],
          "NACHNAMEN" => $row["Nachnamen"],
          "VORNAMEN" => $row["Vornamen"],
          "STATUS" => "__CASE__:".$status,
          "LEHRGÄNGE" => $row["lehrgänge"] ?? "Keine",
        ];
        $ret[] = $entry;
      }
    } else {
      $this->man->AddMessage("Mysql error: ".$this->db->error);
    }
    return $ret;
} }
