<?php
session_start();
require_once('./../admin/tcpdf/tcpdf.php');
require_once("inc/config.inc.php");
require_once("inc/functions.inc.php");

// Überprüfen, ob eine Benutzer-ID in der Session vorhanden ist
if (!isset($_SESSION['userid'])) {
    die("Kein Benutzer angemeldet.");
}

$user = check_user();

if($_GET['id'] && $user["admin"] == 1){
	$user_id = $_GET['id'];
}else{
	$user_id = $_SESSION['userid'];
}

$mitarbeiterName = ""; // Holen Sie den Namen des Mitarbeiters aus der Datenbank
$firmaName = "Praxis Creutzburg"; // Setzen Sie den Firmennamen


$selectedMonth = $_GET['month'] ?? date('m'); // Monat vom Benutzer oder aktueller Monat
$selectedYear = $_GET['year'] ?? date('Y'); // Jahr vom Benutzer oder aktuelles Jahr

$selectedMonthSQL = str_pad($selectedMonth, 2, '0', STR_PAD_LEFT);

#echo $selectedMonthSQL;

try {
	
	$query2 = "
	SELECT 
		DATE(timestamp_datetime) AS datum,
		GROUP_CONCAT(timestamp_type ORDER BY timestamp_datetime) AS day_sequence
	FROM 
		timestamps
	WHERE 
		employee_id = :employee_id AND
		MONTH(timestamp_datetime) = :selectedMonth AND
		YEAR(timestamp_datetime) = :selectedYear
	GROUP BY 
		DATE(timestamp_datetime);";
		
	$stmt = $pdo->prepare($query2);
	$stmt->bindParam(':employee_id', $user_id, PDO::PARAM_INT);
	$stmt->bindParam(':selectedMonth', $selectedMonth, PDO::PARAM_INT);
	$stmt->bindParam(':selectedYear', $selectedYear, PDO::PARAM_INT);
	$stmt->execute();
	$result = $stmt->fetchAll();

	#$invalidDates = [];

} catch(PDOException $e) {
	echo "Datenbankfehler: " . $e->getMessage();
}

foreach ($result as $row) {
	
	if (!isValidSequence($row["day_sequence"])) {
		$fehlerhafteTage[] = $row["datum"];
	}
}

if ($fehlerhafteTage){
	
	include 'header.php'; ?>
<div class="container">
    <div class="row">
        <div class="col-md-12">
<h2>Stempelkarten-System</h2>
<?php	
	
	echo "<h1>Fehlzeiten erkannt</h1><br><h4>Bitte erst beheben.</h4><br>";	

?>	

	<a href="index.php" class="btn btn-info btn-lg btn-block">Zurück</a>


		</div>
	</div>
</div>

<?php include 'footer.php'; 	
	
	exit;
}


try {
    // Holen Sie den Namen des Mitarbeiters aus der Datenbank
    $user_stmt = $pdo->prepare("SELECT vorname, nachname FROM users WHERE id = ?");
    $user_stmt->bindParam(1, $user_id);
    $user_stmt->execute();
    $user = $user_stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($user) {
        $mitarbeiterName = $user['vorname'] . ' ' . $user['nachname'];
    } else {
        die("Mitarbeiter nicht gefunden.");
    }

    // Holen Sie die Zeiten des Mitarbeiters aus der Datenbank
    $times_stmt = $pdo->prepare("SELECT 
  DATE(timestamp_datetime) AS day,
  MIN(CASE WHEN timestamp_type = 'KOMMEN' THEN timestamp_datetime END) AS first_come,
  MAX(CASE WHEN timestamp_type = 'GEHEN' THEN timestamp_datetime END) AS last_go,
  
  SEC_TO_TIME(SUM(
    CASE 
      WHEN timestamp_type = 'GEHEN' THEN UNIX_TIMESTAMP(timestamp_datetime)
      WHEN timestamp_type = 'KOMMEN' THEN -UNIX_TIMESTAMP(timestamp_datetime)
      ELSE 0 
    END
  )) AS total_time,
  SEC_TO_TIME(
    TIME_TO_SEC(
      SEC_TO_TIME(
        UNIX_TIMESTAMP(
          MAX(CASE WHEN timestamp_type = 'GEHEN' THEN timestamp_datetime END)
        ) - UNIX_TIMESTAMP(
          MIN(CASE WHEN timestamp_type = 'KOMMEN' THEN timestamp_datetime END)
        )
      )
    ) - TIME_TO_SEC(SEC_TO_TIME(SUM(
      CASE 
        WHEN timestamp_type = 'GEHEN' THEN UNIX_TIMESTAMP(timestamp_datetime)
        WHEN timestamp_type = 'KOMMEN' THEN -UNIX_TIMESTAMP(timestamp_datetime)
        ELSE 0 
      END
    ))) 
  ) AS difference_between_total_time_and_pause_time
FROM 
  timestamps   
  WHERE 
    employee_id = :employee_id AND
    MONTH(timestamp_datetime) = :month AND
    YEAR(timestamp_datetime) = :year
  GROUP BY 
    DATE(timestamp_datetime)");
	
	$times_stmt->bindParam(':employee_id', $user_id, PDO::PARAM_INT);
	$times_stmt->bindParam(':month', $selectedMonth, PDO::PARAM_INT);
	$times_stmt->bindParam(':year', $selectedYear, PDO::PARAM_INT);
    $times_stmt->execute();
    // Ergebnisse abrufen
	#$result = $times_stmt->fetchAll();
	
	#if (count($result) > 0) {
	
	// Erstellen eines leeren Arrays, um die gesammelten Daten zu speichern
	$times_data = [];

	// Schleife durch die Ergebnisse der Abfrage und Speichern der Daten in einem assoziativen Array mit dem Tag als Schlüssel
	while ($row = $times_stmt->fetch(PDO::FETCH_ASSOC)) {
		$day = date('d', strtotime($row['day']));
		$times_data[$day] = $row;
	}

	
		// Erstellen des PDF-Dokuments
		$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

		$pdf->SetCreator(PDF_CREATOR);
		$pdf->SetAuthor($mitarbeiterName);
		$pdf->SetTitle('Arbeitszeiten');
		$pdf->SetSubject('Arbeitszeiten von ' . $mitarbeiterName);

		$pdf->AddPage();
		$stempdate = $selectedYear . "-" . $selectedMonth . "-1" ;
		$date = new DateTime($stempdate);
		
		// the international date formater object
		$formatter = new IntlDateFormatter( 
			"de-DE", 
			IntlDateFormatter::LONG, 
			IntlDateFormatter::NONE, 
			"Europe/Berlin", 
			IntlDateFormatter::GREGORIAN, 
			"MMMM" 
		); 

		// Konvertieren Sie die Monatsnummer in einen Monatsnamen
		#$dateObj   = DateTime::createFromFormat('!m', $selectedMonth);
		$monthName = $formatter->format($date); // z.B. March



		$html = '<h1>Arbeitszeiten - ' . $firmaName . '</h1>';
		$html .= '<h2>Mitarbeiter: ' . $mitarbeiterName . '</h2>';
		$html .= '<h3>Monat:  ' . $monthName . ' ' . $selectedYear . '</h3>';
		$html .= '<table border="1"  style="font-size:14px;" width=100%>';
		$html .= '<tr><th style="width: 7%;">Tag</th><th style="width: 12%;">Start</th><th style="width: 12%;">Pause</th><th style="width: 12%;">Ende</th><th>Gesamtzeit</th><th style="width: 20%;font-size:12px;">aufgezeichnet am:</th><th style="width: 23%;">Bemerkung</th></tr>';
		
		// Schleife durch die Tage 1-31
		for ($day = 1; $day <= 31; $day++) {
			
			$daytwo = str_pad($day, 2, '0', STR_PAD_LEFT);
			// Überprüfen, ob Daten für diesen Tag vorhanden sind
			if (isset($times_data[$daytwo])) {
				// Daten für diesen Tag aus dem Array abrufen
				$row = $times_data[$daytwo];
				
				$html .= '<tr><td>' . $day . '</td><td>' . date('H:i:s', strtotime($row['first_come'])) . '</td><td>' . $row['difference_between_total_time_and_pause_time']  . '</td><td>' . date('H:i:s', strtotime($row['last_go'])) . '</td><td>' . $row['total_time'] . '</td><td>' . date('d.m.Y', strtotime($row['day'])) . '</td><td></td></tr>';
				list($hours, $minutes, $seconds) = explode(':', $row["total_time"]);
				$totalSeconds += $hours * 3600 + $minutes * 60 + $seconds;
				
				
			} else {
				// Wenn keine Daten für diesen Tag vorhanden sind, eine leere Zeile ausgeben
				$html .= '<tr><td>' . $day . '</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>';
			}
			

		}
		// Umwandeln der gesamten Sekunden zurück in Stunden, Minuten, Sekunden
		$hours = floor($totalSeconds / 3600);
		$mins = floor($totalSeconds / 60 % 60);
		$secs = floor($totalSeconds % 60);
		$totalTime = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
			
		#echo "Gesamtzeit über alle Tage: " . $totalTime;
		$html .= '<tr><td></td><td></td><td></td><td><b>Gesamt</b></td><td><b>' . $totalTime .'</b></td><td></td><td></td></tr>';
		
		$html .= '</table>';

		$pdf->writeHTML($html, true, false, true, false, '');

		$pdf->Output('Arbeitszeiten_' . $user['nachname'] . '_' . $selectedYear . '_' . $selectedMonth . '.pdf', 'I');
	#} else {
	#  echo "Keine Ergebnisse gefunden";
	#}	
	
	
	
} catch(PDOException $e) {
    echo "Datenbankfehler: " . $e->getMessage();
}
?>