<?php

include "functions.php";
app_require_csrf();
include "header.php";
include "headerline.php";
include "nav.php";



?>
<!-- Banner -->
	<section id="banner">
		<div class="content">

<?php
if(checkKaffeelisteAdmin($conn, $mailadress)){

function csv_h($value): string
{
    return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
}

function csv_upload_dir(): string
{
    return APP_ROOT . '/var/uploads';
}

function csv_prepare_upload(array $file): array
{
    if (($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) {
        return [null, 'Fehler beim Hochladen der Datei.'];
    }

    if (($file['size'] ?? 0) <= 0 || $file['size'] > 5 * 1024 * 1024) {
        return [null, 'Die CSV-Datei ist leer oder größer als 5 MB.'];
    }

    $originalName = (string)($file['name'] ?? '');
    $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
    if ($extension !== 'csv') {
        return [null, 'Es sind nur CSV-Dateien erlaubt.'];
    }

    $tmpName = (string)($file['tmp_name'] ?? '');
    if (!is_uploaded_file($tmpName)) {
        return [null, 'Die hochgeladene Datei konnte nicht verifiziert werden.'];
    }

    if (function_exists('finfo_open')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = $finfo ? finfo_file($finfo, $tmpName) : false;
        if ($finfo) {
            finfo_close($finfo);
        }

        $allowedMimeTypes = [
            'text/plain',
            'text/csv',
            'text/x-csv',
            'application/csv',
            'application/vnd.ms-excel',
            'application/octet-stream',
        ];
        if (is_string($mime) && !in_array($mime, $allowedMimeTypes, true)) {
            return [null, 'Der Dateityp wurde nicht als CSV erkannt.'];
        }
    }

    $uploadDir = csv_upload_dir();
    if (!is_dir($uploadDir)) {
        @mkdir($uploadDir, 0700, true);
    }
    if (!is_dir($uploadDir) || !is_writable($uploadDir)) {
        return [null, 'Der Upload-Ordner ist nicht beschreibbar.'];
    }

    $targetFile = $uploadDir . '/paypal_' . date('Ymd_His') . '_' . bin2hex(random_bytes(8)) . '.csv';
    if (!move_uploaded_file($tmpName, $targetFile)) {
        return [null, 'Die CSV-Datei konnte nicht gespeichert werden.'];
    }

    return [$targetFile, null];
}


// Funktion zum Überprüfen, ob der Mitarbeiter in der Tabelle vorhanden ist
function isMitarbeiterExist($conn, $name)
{
    $sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?";
    $params = array($name, $name);
    $stmt = sqlsrv_query($conn, $sql, $params);

    if ($stmt === false) {
        die(print_r(sqlsrv_errors(), true));
    }

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    return ($row !== false);
}

// Funktion zum Überprüfen, ob ein identischer Eintrag bereits vorhanden ist
function isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum)
{
    // Um nur den gleichen Tag zu vergleichen, konvertieren wir den Datum-String zu einem DateTime-Objekt und verwenden die Funktion CONVERT
    $date = date_create($datum);
    if ($date === false) {
        return false;
    }

    $convertedDatum = date_format($date, 'Y-m-d');
	
    #$sql = "SELECT count FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?";
	$sql = "SELECT * FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?";
	$params = array($mitarbeiterID, $betrag, $convertedDatum);
	$stmt = sqlsrv_query($conn, $sql, $params);

    if ($stmt === false) {
        die(print_r(sqlsrv_errors(), true));
    }

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    return $row !== null && (int)$row['MitarbeiterID'] > 0;
}

// Funktion zum Verarbeiten der CSV-Datei und Rückgabe der Ergebnisse
function processCSV($conn, $file)
{
    $handle = fopen($file, "r");
    $success_entries = [];
    $failed_entries = [];

    // Überspringe die erste Zeile (Header) der CSV-Datei
    fgetcsv($handle);

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if (count($data) < 8) {
            $failed_entries[] = array($data[0] ?? '', $data[3] ?? '', $data[7] ?? '', 4);
            continue;
        }

        $name = $data[3]; // Index 3 entspricht dem "Name"-Feld in der CSV
        $betrag = $data[7]; // Index 7 entspricht dem "Brutto"-Feld in der CSV
		$betrag = str_replace(",", ".", $betrag);
		#echo "<br>";
		#$Ausgabe = array($data[0], $data[3], $data[7]);
        // Überprüfen, ob der Mitarbeiter existiert und der Betrag positiv ist
        if (isMitarbeiterExist($conn, $name) && $betrag > 0) {
		
            $mitarbeiterID = getMitarbeiterID($conn, $name);
            $datum = $data[0]; // Index 0 entspricht dem "Datum"-Feld in der CSV
			
			// Überprüfen, ob ein identischer Eintrag bereits vorhanden ist
            if (!isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum)) {
			
				// Eintrag in die Tabelle dbo.kl_Einzahlungen einfügen
				$sql = "INSERT INTO kl_Einzahlungen (MitarbeiterID, Betrag, Datum) VALUES (?, ?, ?)";
				$params = array($mitarbeiterID, $betrag, $datum);
				$stmt = sqlsrv_query($conn, $sql, $params);

				if ($stmt) {
					$success_entries[] = array($data[0], $data[3], $data[7], 0);
				} else {
					$failed_entries[] = array($data[0], $data[3], $data[7], 1);
					#die(print_r(sqlsrv_errors(), true));
				}
			}else {
				#echo "Eintrag bereits vorhanden: " . print_r($data, true) . "\n";
				$failed_entries[] = array($data[0], $data[3], $data[7], 2);
			}

        } else {
            $failed_entries[] = array($data[0], $data[3], $data[7], 3);
        }
		
    }

    fclose($handle);

    return ['success' => $success_entries, 'failed' => $failed_entries];
}

// Funktion zum Abrufen der MitarbeiterID
function getMitarbeiterID($conn, $name)
{
    $sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?";
	$params = array($name, $name);
    $stmt = sqlsrv_query($conn, $sql, $params);


    if ($stmt === false) {
        die(print_r(sqlsrv_errors(), true));
    }

	while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))  
	{  
		  return $row['MitarbeiterID'];  
	}
	#echo $mitarbeiterid;
	
}

// Überprüfen, ob das Formular abgeschickt wurde
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Überprüfen, ob eine Datei hochgeladen wurde
    if (isset($_FILES["csv_file"])) {
        [$csvFile, $uploadError] = csv_prepare_upload($_FILES["csv_file"]);

        if ($uploadError !== null) {
            echo csv_h($uploadError);
        } else {
            // CSV-Datei verarbeiten
            $result = processCSV($conn, $csvFile);
            @unlink($csvFile);

            echo "CSV-Datei erfolgreich verarbeitet.\n";

            echo "<h3>Auswertung</h3>";
            echo "<table>

		<tr>
			<th>Name</th>
			<th>Datum</th>
			<th>Betrag</th>
			<th>Ergebnis</th>
		</tr>";

            foreach ($result['success'] as $eintrag){
            echo "<tr>
			 <td>" . csv_h($eintrag[0]) . "</td>
			 <td>" . csv_h($eintrag[1]) . "</td>
			 <td>" . csv_h($eintrag[2]) . "</td>
			  <td>Erfolgreich gespeichert</td>
			  </tr>";
            }
            foreach ($result['failed'] as $eintrag){
            echo "<tr>
			 <td>" . csv_h($eintrag[0]) . "</td>
			 <td>" . csv_h($eintrag[1]) . "</td>
			 <td>" . csv_h($eintrag[2]) . "</td>
			  <td>";
			  if($eintrag[3] == 1){
				echo "SQL Fehler";
			  }elseif($eintrag[3] == 2){
				echo "Eintrag schon vorhanden";
			  }elseif($eintrag[3] == 3){
				echo "Benutzer nicht gefunden";
			  }elseif($eintrag[3] == 4){
				echo "Ungültige CSV-Zeile";
			  }
			  
			  echo "</td>
			  </tr>";
            }
            echo "</table>";
        }

    } else {
        echo "Fehler beim Hochladen der Datei.";
    }
}


?>

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSV Verarbeitung</title>
</head>
<body>
    <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
        <?php echo app_csrf_field(); ?>
        <label for="csv_file">CSV-Datei auswählen:</label>
        <input type="file" name="csv_file" accept=".csv" required>
        <button type="submit">Datei hochladen</button>
    </form>
</body>
</html>

<?php




}else{
	echo "<h2>Kein Zugriff</h2>";
	
}
?>

</div>
</section>


<?php include "footer.php"; ?>
