<?php

session_start();

ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);




$_SESSION["meta"]=$meta;

error_reporting(E_ALL);
ini_set('display_errors', 1);



$db = new SQLite3('../db-test/test.db');


// weil die Bestandssuche (im Gegensatz zur Ortssuche) die Programmbezeichnung durhcsucht, ist hier etwas mehr Aufwand erforderlich
// hole die Programmbezeichnung via 2x JOIN aus der Datenbank
$result = $db->query("

	SELECT 
		m.id AS measurement_id,
		m.comment AS comment,
		m.timestamp AS timestamp,
		m.place_name AS place_name,
		b.value AS bit_value,
		b.position AS bit_position,
		n.node_from AS node_from,
		n.node_to AS node_to
	FROM 
		measurements m
	JOIN places p ON p.name = m.place_name
	JOIN measurement_program_id_bits b ON b.measurement_id = m.id
	JOIN measurement_nodes n ON n.required_by = m.id

");

/*
Ausgabe sieht z.B. so aus:

| measurement_id | comment | timestamp | place_name   | bit_value | bit_position | node_from | node_to |
| -------------- | ------- | --------- | ------------ | --------- | ------------ | --------- | ------- |
| 1              | xyz..   | 34535454  | Dudweiler Df | S         | 0            | 20        | 28      |
| 1              | xyz..   | 34535454  | Dudweiler Df | S         | 0            | 28        | 30      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 1            | 20        | 28      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 1            | 28        | 30      |
| 1              | xyz..   | 34535454  | Dudweiler Df | 4         | 2            | 20        | 28      |
| 1              | xyz..   | 34535454  | Dudweiler Df | 4         | 2            | 28        | 30      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 3            | 20        | 28      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 3            | 28        | 30      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 4            | 20        | 28      |
| 1              | xyz..   | 34535454  | Dudweiler Df | -         | 4            | 28        | 30      |

*/


// Die Datenbank wird als dreifach indexiertes Array gespeichert
$database_db = [];
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
	$id = $row["measurement_id"];
	
	// Basisdaten setzen (überschreiben macht nichts)
	$database_db[$id]["comment"] = $row["comment"];
	$database_db[$id]["timestamp"] = $row["timestamp"];
	$database_db[$id]["place_name"] = $row["place_name"];
	
	// Programmbits: nur setzen, wenn nicht schon vorhanden
	if (!isset($database_db[$id]["program_id_bits"][$row["bit_position"]])) {
		$database_db[$id]["program_id_bits"][$row["bit_position"]] = $row["bit_value"];
	}

	// Nodes: nur hinzufügen, wenn noch nicht vorhanden
	$node_pair = [$row["node_from"], $row["node_to"]];
	if (
		!isset($database_db[$id]["nodes"]) ||
		!in_array($node_pair, $database_db[$id]["nodes"])
	) {
		$database_db[$id]["nodes"][] = $node_pair;
	}
}


// Ersetzen der $database_db[$id]["nodes"] zu einem String
$bitLength = 5;
$placeholder = '?';
foreach ($database_db as $index => $row) {
	$programIdBits = isset($row['program_id_bits']) ? $row['program_id_bits'] : [];
	$programIdString = '';

	// Baue ein Array mit fester Länge ($bitLength), fülle fehlende Positionen mit Platzhalter
	for ($i = 0; $i < $bitLength; $i++) {
		$programIdString .= isset($programIdBits[$i]) ? $programIdBits[$i] : $placeholder;
	}

	$database_db[$index]['program_id_string'] = $programIdString;
}




// $list ist die CSV-Datei

//$list[] = array("Gemessen am / um", "Stw-Name / Ort" ,"Erkannte Brücken (Pin-zu-Pin)", "(automatisch) ermittelte Programm-Nummer", "Freitext-Besonderheiten");

	
	
// gehe jeden Datenwankeintrag durch
foreach($database_db as $database_entry) {
	// leere dne node_string zu Beginn
	$node_string = "";
	// erstelle einen Brücken-String, der erweitert wird
	foreach($database_entry["nodes"] as $node) {
		$node_string .= $node[0] . "<->" .  $node[1] . ", ";
	}
	
	$imagePath = 'http://localhost/stecker.php?data=' . urlencode(json_encode($database_entry["nodes"])); // URL parsen
	
	// Schreibe ins Array
	$list[] = array(date('d.m.Y H:i:s',$database_entry["timestamp"]), $database_entry["place_name"] ,$node_string, $database_entry["program_id_string"], $database_entry["comment"], $imagePath);
}



function svgUrlToPngViaRsvg(string $svgUrl, string $outputPath): bool {
    $svgData = file_get_contents($svgUrl);
    if ($svgData === false) return false;

    $tempSvg = '../tmp/stecker_' . uniqid() . '.svg';
    file_put_contents($tempSvg, $svgData);
	

    $cmd = escapeshellcmd("rsvg-convert -o " . escapeshellarg($outputPath) . " " . escapeshellarg($tempSvg));
    $result = shell_exec($cmd);

    unlink($tempSvg);

    return file_exists($outputPath);
}





require '../vendor/composer/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;



// Neue Excel-Datei erzeugen
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// Spaltenüberschriften
$sheet->setCellValue('A1', 'Zeitstempel');
$sheet->setCellValue('B1', 'Ort');
$sheet->setCellValue('C1', 'Brücken');
$sheet->setCellValue('D1', 'Programmbezeichnung');
$sheet->setCellValue('E1', 'Notizen');

// Durch das Array iterieren und Daten + Bild einfügen
$row = 2; // Start in Zeile 2
foreach ($list as $entry) {
    [$timestamp,$place,$bridges,$program_number, $extra, $imagePath] = $entry;

    // Namen einfügen
    $sheet->setCellValue("A$row", $timestamp);
	$sheet->setCellValue("B$row", $place);
	$sheet->setCellValue("C$row", $bridges);
	$sheet->setCellValue("D$row", $program_number);
	$sheet->setCellValue("E$row", $extra);


	
	
	
	$svgUrl = $imagePath;
	$tmpPng = '../tmp/stecker_' . uniqid() . '.png';

    // Bild einfügen, wenn Datei existiert
    if (svgUrlToPngViaRsvg($svgUrl, $tmpPng)) {
		$drawing = new Drawing();
		$drawing->setPath($tmpPng);
		$drawing->setCoordinates("F$row");
		$drawing->setHeight(80);
		$sheet->getRowDimension($row)->setRowHeight(80 * 0.75);
		$drawing->setWorksheet($sheet);
	} else {
		$sheet->setCellValue("F$row", 'Bildkonvertierung fehlgeschlagen');
	}

    $row++;
}

// Spaltenbreite anpassen
$sheet->getColumnDimension('A')->setAutoSize(true);
$sheet->getColumnDimension('B')->setWidth(20); // Platz fürs Bild

// Datei speichern
$writer = new Xlsx($spreadsheet);
$writer->save('../temp.xlsx');

shell_exec("rm ../tmp/*");


?>

<div class="content-header">Export - Fertig</div>
<hr />
<p>
	Ihr Datenexport ist fertig vorbereitet. 
</p>
<div class="save-button" onclick="window.location.href='../temp.xlsx'"); "><img src="/vendor/icons/play.svg" \>Herunterladen</div>


