<?php
# Hier werden die Anfragen vom Javascript verarbeitet und die
# Datenbank bedient

include 'config_stern.php';
include 'phpmailer/dosendmail.php';



// Holen der Einträge in der anmelde-Datenbank für den selektierten Tag
// Parameter
//      $fid -> so viele Einträge ab jetzt holen <<<???
// Retunrn:
//      Array mit den Einträgen
function getAnmeldungen($fid)
{
    global $db;
    $erg = array();
    $sql_stmt = "SELECT * FROM anmeldungen WHERE fid='$fid'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}

// Holen der Daten aller oder eine einzelnen BEOs
//
// Parameter:
//      $id         ID des zu holenden BEOs, undefined -> alle holen
//      $og         true: nur die, die Führung machen, sonst alle
// Return:
//      Array mit allen BEOs
function getBEOs($id, $og, $what)
{
    global $db;
    if ($id != 'all') {
        $sql_stmt = "SELECT $what FROM beos where id='$id' order by name";
    } else {
        if($og == 'true') {
            $sql_stmt = "SELECT $what FROM beos where gruppe !='' order by name";
        } else {
            $sql_stmt = "SELECT $what FROM beos  order by name";
        }
    }
    $erg = array();
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}

function getOneBEO($kurz, $what)
{
    global $db;

    if ($what == 'true') {
	$sql_stmt = "SELECT * FROM beos where name='$kurz'";
    } else {
        $sql_stmt = "SELECT $what FROM beos where kürzel='$kurz'";
    }
    $erg = array();
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    $data = mysqli_fetch_assoc($result);
    return $data ;
    // while ($row = mysqli_fetch_assoc($result)) {
    //     foreach($row as $key => $value) {
    //         $entry[$key] = $value;
    //     }
    //     $erg[] = $entry;
    // }
    // return $erg;
}

function updateOneBEOpw($data)
{
    global $db;
    $sql_stmt = "UPDATE beos SET pw='$data[pw]' where kürzel='$data[kurz]'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}


// Daten eines Teilnehmers abholen
// Parameter:
//      $id:        Teilnehmer - ID
// Return:
//      Dict mit allen Daten des Teilnehmers
function getTeilnehmer($seed,$isid,$withdate)
{
    global $db;
    $today = date('Ymd');
    $erg = array();
    $entry = array();
    if ($seed == -1) {
        $sql_stmt = "SELECT email, fid, id, anzahl FROM anmeldungen WHERE email != '-'";
    } else if($isid) {
        $sql_stmt = "SELECT * FROM anmeldungen WHERE id='$seed'";
    } else {
        if ($withdate) {
            $sql_stmt = "SELECT * FROM anmeldungen WHERE email='$seed' AND fdatum >= '$today'";
        } else {
            $sql_stmt = "SELECT * FROM anmeldungen WHERE email='$seed'";
        }
    }
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}

// Daten aller Teilnehmer ab eines Führungsdatumns abholen
// Parameter:
//      $fid:        Führungsdatum, ab dem die Info geholt wirdTeilnehmer - ID
// Return:
//      Dict mit allen Daten des Teilnehmers
function getAllTeilnehmer($fdatum)
{
    global $db;
    $erg = array();
    $entry = array();
    $sql_stmt = "SELECT * FROM anmeldungen WHERE fdatum>='$fdatum' ORDER BY fid ASC";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}



// die Daten der Führungen in dem Bereich start - end
// in ein Array als ISO8601 holen
// Parameter
//      $start -> ab diesem Datum
//      $end   -> bis zu diesem Datum
// Retunrn:
//      Array mit den Daten in ISO8601
function getFuehrungen($start, $end) {
    global $db;
    $erg = array();
    $sql_sel = "SELECT * FROM fdatum1 where datum >= '$start' AND datum <= '$end' ORDER BY datum ASC";
    $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}


// die Daten der nächsten $soviel Führungen in ein Array holen
// Parameter
//      $soviel -> so viele Einträge ab jetzt holen
// Retunrn:
//      Array mit allen Werten aus der Table
function getNextFuehrungen($soviel, $fid) {
    global $db;
    $erg = array();
    $datum_heute = date("Ymd",strtotime("-1 days"));
    if ($fid != 0) {
        $sql_sel = "SELECT id, wtag, datum, uhrzeit   FROM  fdatum where id >= $fid order by datum ASC LIMIT $soviel";
    } else {
        $sql_sel = "SELECT id, wtag, datum, uhrzeit   FROM  fdatum where datum >='$datum_heute'  order by datum ASC LIMIT $soviel";
    }
    $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
    while ($row = mysqli_fetch_row($result)) {
        $entry = array();
        $entry['fid'] = $row[0];
        $entry['weekday'] = $row[1];
        $entry['date'] = $row[2];
        $entry['time'] = $row[3];
        $erg[] = $entry;
    }
    return $erg;
}

function updateTeilnehmer_fdate($id, $fdatum, $fid) {
    global $db;
    $sql_stmt = "UPDATE anmeldungen SET fdatum=$fdatum,fid=$fid where id=$id";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

function updateentries($nr,$val,$field)
{
    global $db;
    $result = false;
    for ($i = 0; $i < count($nr); $i++) {
        $sql_stmt = "UPDATE anmeldungen SET $field=$val[0] where id=$nr[$i]";
        $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    }
    return $result;
}

function delCalentry($id) {
    global $db;
    $sql_stmt = "DELETE FROM kalender WHERE id='$id'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

function deleteEntry($id) {
    global $db;
    $sql_stmt = "DELETE FROM anmeldungen WHERE id='$id'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

// Zählen, wieviele Personen zu einem Führungstermin angemeldet sind
// Parameter:
// $fid -> id des Führungsdatum
// Return: Anzahl der Personen
function getCountsPerDate($fid) {
    global $db;
    $sql_stmt = "SELECT SUM(anzahl) AS count FROM anmeldungen WHERE fid='$fid'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    $data = mysqli_fetch_assoc($result);
    return $data['count'] ;
}


// Zählen, wieviele Personen zu einem Führungstermin angemeldet sind
// Parameter:
// $date -> Datum der Führung (YYYMDD)
// Return: Anzahl der Personen
function getCountsPerDatefromDate($date) {
    global $db;
    $sql_stmt = "SELECT SUM(anzahl) AS count FROM anmeldungen  WHERE fdatum='$date'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    $data = mysqli_fetch_assoc($result);
    return $data['count'];
}

// aus dem Datum (yyyymmdd) die fid aus der Tabelle holen
function getfid($datum) {
    global $db;
    $sql_stmt = "SELECT * FROM fdatum1 WHERE datum >= $datum LIMIT 1";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    $data = mysqli_fetch_assoc($result);
    return $data;
}

// aus der fdatum-Tabelle die Details zur übergeben ID holen
function getOneDate($id) {
    global $db;
    $sql_stmt = "SELECT * FROM fdatum1 WHERE id='$id'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    $data = mysqli_fetch_assoc($result);
    return $data;
}

function insertteilnehmer($data) {
    global $db;
    $name = $data['name'];
    $vorname = $data['vorname'];
    $strasse = $data['strasse'];
    $plz = intval($data['plz']);
    $stadt = $data['stadt'];
    $telefon = $data['telefon'];
    $email = $data['email'];
    $anzahl = intval($data['anzahl']);
    $remarks = $data['remarks'];
    $fid = intval($data['fid']);

    $sql_stmt = "INSERT INTO anmeldungen (name,vorname,strasse,plz,stadt,telefon,email,anzahl,remarks,fid,angemeldet) " .
        "VALUES ('$name','$vorname','$strasse','$plz','$stadt','$telefon','$email','$anzahl','$remarks','$fid', CURDATE())";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

function updateteilnehmer($data, $id) {
    global $db;
    $name = $data['name'];
    $vorname = $data['vorname'];
    $strasse = $data['strasse'];
    $plz = $data['plz'];
    $stadt = $data['stadt'];
    $telefon = $data['telefon'];
    $email = $data['email'];
    $anzahl = $data['anzahl'];
    $remarks = $data['remarks'];
    $fid = $data['fid'];

    $sql_stmt = "UPDATE anmeldungen SET " .
        "name='$name', vorname='$vorname', strasse='$strasse', plz='$plz', stadt='$stadt', " .
        "telefon='$telefon', anzahl='$anzahl', remarks='$remarks', angemeldet=CURDATE() WHERE id='$id'";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

// Email raussenden
function sendConfirmation($subject, $to, $body) {
    mb_internal_encoding('UTF-8');
    $subject = mb_encode_mimeheader($subject, 'UTF-8', 'Q');
    $absender = "noreply@sternwarte-welzheim.de";
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "Content-type: text/plain; charset=utf-8";
    $headers[] = "From: {$absender}";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    $headers[] = "Reply-To: {$absender}";
    mail($to, $subject, $body, implode("\r\n", $headers),"-f noreply@sternwarte-welzheim.de");
}

// Email raussenden
function sendInfoMail($subject, $to, $body) {
    mb_internal_encoding('UTF-8');
    $subject = mb_encode_mimeheader($subject, 'UTF-8', 'Q');
    $absender = "noreply@sternwarte-welzheim.de";
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "Content-type: text/html; charset=utf-8";
    $headers[] = "From: {$absender}";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    $headers[] = "Reply-To: {$absender}";
    mail($to, $subject, $body, implode("\r\n", $headers),"-f noreply@sternwarte-welzheim.de");
}

// Führungsdaten eintragen (für kalender)
function putFdates($data) {
    global $db;

    foreach ($data as $d) {
        $start = $d['start'];
        $grp = $d['group'];
        $sql_stmt = "INSERT IGNORE INTO fdates (dateTime, grp)" .
            "VALUES ('$start','$grp')";
        $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    }
    return $result;
}

// die Daten der Führungen (fdatum) in dem Bereich start - end
// in ein Array als ISO8601 holen
// Parameter
//      $start -> ab diesem Datum
//      $end   -> bis zu diesem Datum
// Return:
//      Array mit den Daten
function getFdates($start, $end) {
    global $db;
    $erg = array();
    $s = date('Ymd', strtotime($start));
    $e = date('Ymd', strtotime($end));
    $sql_sel = "SELECT * FROM fdatum1 where datum >= '$s' AND datum <= '$e'";
    $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
    while ($row = mysqli_fetch_row($result)) {
        $entry = array();
        $entry['start'] = $row[2];
        $entry['uhr'] = substr($row[3],0,2);
        $entry['title'] = $row[5];
        $entry['count'] = getCountsPerDatefromDate($row[2]);
        $erg[] = $entry;
    }
    return $erg;
}

function putCalEntry($data) {
    global $db;
    $t = $data['title'];
    $d = $data['description'];
    $dt = $data['start'];
    $e = $data['end'];
    $sql_stmt = "INSERT INTO kalender (start, end, title, description)" .
            "VALUES ('$dt', '$e', '$t', '$d')";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

function getCalEntries($start, $end) {
    global $db;
    $erg = array();
    $s = date('Ymd', strtotime($start));
    $e = date('Ymd', strtotime($end));
    $sql_sel = "SELECT * FROM kalender where start >= '$s' AND start <= '$e'";
    $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}

function updateCount($date, $anzahl) {
    global $db;
    $sql_stmt = "UPDATE fdatum1 SET count=count-$anzahl WHERE datum=$date AND count >0";
    $result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
    return $result;
}

function getOneRecordTermin($termin)  {
    global $db;
    $erg = array();
    $sql_sel = "SELECT * FROM SoFue2 WHERE DATE(wtermin)='$termin' AND status=2";
    $result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
    while ($row = mysqli_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $entry[$key] = $value;
        }
        $erg[] = $entry;
    }
    return $erg;
}


// Ein Record von den Sonderführungen mit der ID $id holen und kompleet übermitteln
function getOneSonderTeilnehmer($id)  {
	global $db;
        $query = "select * from SoFue2  where id = $id";
    	$result = mysqli_query($db, $query) or die(mysqli_error($db));
    	while ($row = mysqli_fetch_assoc($result)) {
        	foreach ($row as $key => $value) {
            		$entry[$key] = $value;
        	}
        	$erg[] = $entry;
    	}
    	return $erg;
}




$_POST = json_decode(file_get_contents('php://input'), true);

$erg = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $cmd = $_POST["cmd"];
/*
    $x = "[";
    foreach ($_POST as $key => $value) {
        if(gettype($value) == "array") {
           $value = $value[0];
        }
        $x = $x . $key . " => " . $value . ",";
    }
    $x = $x . "]";
*/
    switch ($cmd) {
        case 'GET_ANMELD':
            $erg = getAnmeldungen($_POST['id']);
            break;
        case 'GET_TEILN':
            $erg = getTeilnehmer($_POST['id'], true, false);
            break;
        case 'GET_DATES':
            $erg = getNextFuehrungen($_POST['anzahl'], $_POST['fid']);
            break;
        case 'UPDATE':
            $erg = "Nix gut";
            if ((count($_POST['ids']) != 0) and (count($_POST['values']) != 0)) {
                $rows = $_POST['ids'];
                $values = $_POST['values'];
                $erg = updateEntries($rows, $values, $_POST['field']);
            }
            break;
        case 'UPDATETLNFD':
            $erg = updateTeilnehmer_fdate($_POST['id'], $_POST['fdatum'], $_POST['fid']);
            break;
        case 'DELETE_ENTRY':
            $erg = deleteEntry($_POST['id']);
            break;
        case 'GET_COUNTS':
            $erg = getCountsPerDate($_POST['id']);
            break;
        case 'GET_COUNTS_DATE':
            $erg = getCountsPerDatefromDate($_POST['date']);
            break;
        case 'GET_TEILN_EMAIL':
            $erg = getTeilnehmer($_POST['mail'], false, false);
            break;
        case 'GET_DATE_BY_EMAIL':
            $erg = getTeilnehmer($_POST['mail'], false, true);
            break;
        case 'GET_ONE_DATE':
            $erg = getOneDate($_POST['fid']);
            break;
        case 'GET_ALLTEILN':
            $erg = getAllTeilnehmer($_POST['fdatum']);
            break;
        case 'SEND_MAIL':
            $erg = sendConfirmation($_POST['subject'], $_POST['to'], $_POST['body']);
            break;
        case 'SEND_INFO_MAIL':
            $erg = sendInfoMail($_POST['subject'], $_POST['to'], $_POST['body']);
            break;
        case 'SEND_MAIL_HTML':
            $absender = "noreply@sternwarte-welzheim.de";
            $erg = sendmail($_POST['subject'], $absender, $_POST['body_txt'], [], [], $_POST['to'], $_POST['body_html']);
//            function sendmail($subject, $from, $body_txt, $cc=[], $bcc=[], $to=[], $body_html="") {
             break;
        case 'INSERT_TLN':
            $erg = insertTeilnehmer($_POST['data']);
            break;
        case 'UPDATE_TLN':
            $erg = updateTeilnehmer($_POST['data'], $_POST['id']);
            break;
        case 'DELETE_TLN':
            $erg = deleteEntry($_POST['id']);
            break;
        case 'UPDATECOUNT':
            $erg = updateCount($_POST['date'], $_POST['anzahl']);
            break;
        case 'GET_ALL_EMAILS':
            $erg = getTeilnehmer(-1, true, false);
            break;
        case 'GET_FUEHRUNGEN':
            $erg = getFuehrungen($_POST['start'], $_POST['end']);
            break;
        case 'PUT_FDATES':
            $erg = putFdates($_POST['data']);
            break;
        case 'GET_FDATES':
            $erg = getFdates($_POST['start'], $_POST['end']);
            break;
        case 'GET_BEOS':
            if ( isset($_POST['what'])) {
                $erg = getBEOs($_POST['id'], $_POST['onlyguides'], $_POST['what']);
            } else {
                $erg = getBEOs($_POST['id'], $_POST['onlyguides'], '*');
            }
            break;
        case 'GET_ONEBEO':
            $erg = getOneBEO($_POST['kurz'], $_POST['what']);
            break;
        case 'UPDATE_ONEBEOPW':
            $erg = updateOneBEOpw($_POST['data']);
            break;            
        case 'PUT_CALENTRY':
            $erg = putCalEntry($_POST['data']);
            break;
        case 'GET_CALENTRIES':
            $erg = getCalEntries($_POST['start'], $_POST['end']);
            break;
        case 'DEL_CALENTRY':
            $erg = delCalentry($_POST['id']);
            break;
        case 'GET_FID':
            $erg = getfid($_POST['fdatum']);
            break;
        case 'GET_MAINT':
            include 'maintenance.php';
            $erg = $maint;
            break;
        case 'GET_ONETERMIN':
            $erg = getOneRecordTermin($_POST["termin"]);
            break;            
        case 'GET_ONESONDERTEILNEHMER':
            $erg = getOneSonderTeilnehmer($_POST["id"]);
            break;

        default:
            $erg = ['error' => 'Unknown POST-Command', 'cmd' => $cmd, 'params' => $x];
    }
} else {
/*    
    $x = "[";
    foreach ($_GET as $key => $value) {
        $x = $x . $key . " => " . $value . ",";
    }
    $x = $x . "]";
*/
    $cmd = $_GET['cmd'];
    switch ($cmd)  {
        case 'GET_FDATES':
            $erg = getFdates($_GET['start'], $_GET['end']);
            break;
        default:
            $erg = ['error' => 'Unknown GET-Command', 'params' => $x];
    }
}

// header("Content-type: text/json;charset=utf-8");

echo json_encode($erg);



