<?php

// Test urls:
// https://media.metz-connect.com/index.php?itno=130910-I&language=en&type=image1
// https://media.metz-connect.com/index_test.php?itno=130910-I&language=en&type=image1

// $http="http://10.98.0.30/";
$http = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['SERVER_NAME']."/";
// Parameter ermitteln
$uri = $_SERVER['REQUEST_URI'];

// Automatische Erkennung: Wenn Skript "index_test.php" heißt, nutze /test Unterpfad
$scriptName = basename($_SERVER['SCRIPT_NAME']);
$testPath = ($scriptName === 'index_test.php') ? 'test/' : '';
$isTestMode = ($scriptName === 'index_test.php');

if ($isTestMode) {
	error_log("[MEDIA] TEST-MODE aktiv (Skript: {$scriptName})");
}

if ( count($_GET) > 1 ) {
	if ( checkValidParms($isTestMode) ) {
		// Prüfen ob die Datei vorhanden ist
		$file='';
		$file_www='';
		$itno = strtoupper($_GET['itno']);
		
		$subfolder="";
		$extension = "";
		$contentType = "";
		
		switch ($_GET['type']) {
			case 'image1':
				$subfolder="128";
				$extension = ".PNG";
				$dateiname = "product_image_";
				$contentType = "image/png";
				break;
			case 'datasheet':
				$subfolder="171";
				$extension = ".PDF";
				$contentType = "application/pdf";
				switch ($_GET['language']) {
					case 'de':
						$dateiname="Datenblatt_";
						break;
					case 'fr':
						$dateiname="Fiche_de_spécifications_";
						break;
					default:
						$dateiname="Data_sheet_";
				}
				break;
			case 'install':
				$subfolder="163";
				$extension = ".PDF";
				$contentType = "application/pdf";
				switch ($_GET['language']) {
					case 'de':
						$dateiname="Montageanleitung_";
						break;
					case 'fr':
						$dateiname="Notice_de_montage_";
						break;
					default:
						$dateiname="Mounting_instruction_";
				}
				break;
		}
		
		// Test-Pfad wird hier eingefügt
		$file="/var/www/html/files/{$testPath}{$subfolder}/{$dateiname}{$itno}{$extension}";
		
		if (!file_exists($file)) {
			if ($isTestMode) {
				error_log("[MEDIA] Datei nicht gefunden (original ITNO): {$itno} | Pfad: {$file}");
			}
			
			/****************
				Wenn Artikel beginnt mit AJ dann volle Artikelnummer (Keine Referenzartikel - US) 
				Wenn Artikel beginnt mit "31" oder A dann Referenzartikel gleich = erste 6 Stellen der Artikelnummer (z.B. 31001102 =>  310011)
				Wenn Artikel beginnt mit  F oder S oder R dann erste 5 Stellen + XX + weitere vier Stellen (z.B. SM99S01VBNN05G7 => SM99SXXVBNN)
			*****************/
			$itnoOriginal = $itno;
			
			if ( substr($itno,0,2) == 'AJ') {
				// AJ-Artikel: Keine Kürzung
			} elseif ( substr($itno,0,2) == '31' || substr($itno,0,1) == 'A' )  {
				if ( strlen($itno) != 5 ) {
					$itno = substr($itno,0,6);
					if ($isTestMode) {
						error_log("[MEDIA] Fallback: Kuerze auf Referenz-Artikel (31/A*) | {$itnoOriginal} -> {$itno}");
					}
				}
			} elseif ( substr($itno,0,1) == 'F' || substr($itno,0,1) == 'S' || substr($itno,0,1) == 'R' ) {
				$itno = substr($itno,0,5).'XX'.substr($itno,7,4);
				if ($isTestMode) {
					error_log("[MEDIA] Fallback: Erstelle Wildcard-ITNO (F/S/R*) | {$itnoOriginal} -> {$itno}");
				}
			}
			
			// Test-Pfad wird hier auch eingefügt
			$file="/var/www/html/files/{$testPath}{$subfolder}/{$dateiname}{$itno}{$extension}";
			
			if ($isTestMode && $itno !== $itnoOriginal) {
				error_log("[MEDIA] Pruefe Fallback-Datei: {$file}");
			}
		}
		
		// Test-Pfad auch in der HTTP-URL
		// Cache-Busting: Timestamp als Query-Parameter anhängen
		$cacheBuster = filemtime($file);
		$file_www=$http."files/{$testPath}{$subfolder}/{$dateiname}{$itno}{$extension}?v={$cacheBuster}";
		
		if (file_exists($file) && $file !== '') {
			if ($isTestMode) {
				$fileSize = filesize($file);
				error_log("[MEDIA] Redirect erfolgreich | Type: {$_GET['type']} | ITNO: {$itno} | Size: " . round($fileSize/1024, 1) . " KB | URL: {$file_www}");
			}
			
			// 302 Found (temporärer Redirect) statt 301 - wird NICHT vom Browser gecacht
			header("HTTP/1.1 302 Found");
			
			// Maximale No-Cache Header
			header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
			header("Cache-Control: post-check=0, pre-check=0", false);
			header("Pragma: no-cache");
			header("Expires: Thu, 01 Jan 1970 00:00:00 GMT");
			
			header("Location: {$file_www}");
			header("Connection: close");
			exit();
		} else {
			// FEHLER: Immer loggen
			error_log("[MEDIA] ERROR 404: Datei nicht gefunden | Type: {$_GET['type']} | ITNO: {$itno} | Pfad: {$file}");
			
			header("HTTP/1.1 404 Not Found");
			header("Content-Type: text/plain");
			header("Connection: close");
			echo "File not found";
			exit();
		}
	} else {
		// FEHLER: Immer loggen
		error_log("[MEDIA] ERROR 400: Ungueltige Parameter | Params: " . http_build_query($_GET) . " | IP: " . $_SERVER['REMOTE_ADDR']);
		
		header("HTTP/1.1 400 Bad Request");
		header("Content-Type: text/plain");
		header("Connection: close");
		echo "Invalid parameters";
		exit();
	}
} else {
	// FEHLER: Immer loggen
	$paramCount = count($_GET);
	error_log("[MEDIA] ERROR 400: Zu wenig Parameter | Anzahl: {$paramCount} | URI: {$uri}");
	
	header("HTTP/1.1 400 Bad Request");
	header("Content-Type: text/plain");
	header("Connection: close");
	echo "Missing parameters";
	exit();
}

function checkValidParms($isTestMode = false) {
	$validLangs 		= ['de','en','fr','nl','ru','cn'];
	$validTypes 		= ['image1','datasheet','install'];
	$validITNOLength 	= 15;
	$validITNOChars		= '/[^A-Za-z0-9#-]/';
	$arrayCount = 0;
	
	// Artikelnummer prüfen
	if ( array_key_exists('itno', $_GET) ) {
		$arrayCount++;
		if ( strlen($_GET['itno']) > $validITNOLength ) {
			error_log("[MEDIA] VALIDATION ERROR: ITNO zu lang | Laenge: " . strlen($_GET['itno']) . " (max: {$validITNOLength}) | ITNO: " . $_GET['itno']);
			return false;
		}
		if ( preg_match($validITNOChars, $_GET['itno']) ) {
			error_log("[MEDIA] VALIDATION ERROR: ITNO ungueltige Zeichen | ITNO: " . $_GET['itno']);
			return false;
		}
	} else {
		error_log("[MEDIA] VALIDATION ERROR: ITNO Parameter fehlt");
		return false;
	}
	
	// Typ prüfen
	if ( array_key_exists('type', $_GET) ) {
		$arrayCount++;
		if ( !in_array($_GET['type'], $validTypes)) {
			error_log("[MEDIA] VALIDATION ERROR: Type ungueltig | Type: " . $_GET['type'] . " | Erlaubt: " . implode(', ', $validTypes));
			return false;
		}
	} else {
		error_log("[MEDIA] VALIDATION ERROR: Type Parameter fehlt");
		return false;
	}
	
	// Sprache prüfen
	if ( array_key_exists('language', $_GET) ) {
		$arrayCount++;
		if ( !in_array($_GET['language'], $validLangs)) {
			error_log("[MEDIA] VALIDATION ERROR: Language ungueltig | Language: " . $_GET['language'] . " | Erlaubt: " . implode(', ', $validLangs));
			return false;
		}
	}

	// Anzahl der mitgegebenen Parameter entspricht nicht der Anzahl der geprüften Paramter
	if ( count($_GET) != $arrayCount) {
		error_log("[MEDIA] VALIDATION ERROR: Parameter-Count Mismatch | Erwartet: {$arrayCount} | Erhalten: " . count($_GET) . " | Moeglicher Angriffsversuch");
		return false;
	}
	
	return true;
}
