<?php
// IV1 WP Tools – Main Funktionen
defined("ABSPATH") || exit;

function iv1wpt_plugin_log($message, $log_file = null, $subdir = 'iv1-wp-tools') {

    // Upload-Verzeichnis
    $upload_dir = wp_upload_dir();
    $base_dir   = trailingslashit($upload_dir['basedir']);

    // Zielordner (z. B. /wp-content/uploads/snxt-cost-calculator/)
    $log_dir = trailingslashit($base_dir . trim($subdir, '/'));

    // Ordner erstellen, falls nicht vorhanden
    if (!file_exists($log_dir)) {
        wp_mkdir_p($log_dir);
    }

    // Schutzdateien anlegen (falls nicht vorhanden)
    iv1wpt_plugin_log_protect_dir($log_dir);
	
	// Alte Logs löschen
	iv1wpt_plugin_log_cleanup($log_dir, 30);	

	$berlinNow = new DateTime('now', new DateTimeZone('Europe/Berlin'));

    // Standard-Logdatei (wenn nicht übergeben)
    if (!$log_file) {
        $log_file = $log_dir . 'iv1wpt_plugin_log_' . $berlinNow->format('Y-m-d') . '.log';
    } else {
        // wenn nur Dateiname übergeben wurde, im Logdir ablegen
        if (basename($log_file) === $log_file) {
            $log_file = $log_dir . $log_file;
        }
    }

    // Nachricht normalisieren (Array/Object/WP_Error etc.)
    $normalized = iv1wpt_plugin_log_normalize($message);

	$timestamp = $berlinNow->format('Y-m-d H:i:s');
    $line = '[' . $timestamp . '] ' . $normalized . PHP_EOL;

    // Schreiben (mit Lock)
    @file_put_contents($log_file, $line, FILE_APPEND | LOCK_EX);
}

// ================================================================
// Log-Message normalisieren: String/Array/Object/WP_Error
// ================================================================
function iv1wpt_plugin_log_normalize($message) {

    // WP_Error sauber ausgeben
    if ($message instanceof WP_Error) {
        return 'WP_Error: ' . $message->get_error_code() . ' - ' . $message->get_error_message()
            . ' | data=' . print_r($message->get_error_data(), true);
    }

    // Array / Object
    if (is_array($message) || is_object($message)) {
        return print_r($message, true);
    }

    // Bool / Null / Zahlen
    if (is_bool($message)) {
        return $message ? 'true' : 'false';
    }
    if ($message === null) {
        return 'null';
    }

    // Alles andere als String
    return (string) $message;
}

// ================================================================
// Verzeichnis schützen: .htaccess + index.php
// ================================================================
function iv1wpt_plugin_log_protect_dir($log_dir) {

    // index.php
    $index_file = trailingslashit($log_dir) . 'index.php';
    if (!file_exists($index_file)) {
        @file_put_contents($index_file, "<?php\n// Silence is golden.\n", LOCK_EX);
    }

    // .htaccess (nur relevant bei Apache; schadet sonst nicht)
    $htaccess_file = trailingslashit($log_dir) . '.htaccess';
    if (!file_exists($htaccess_file)) {
        $rules = "Order deny,allow\nDeny from all\n";
        @file_put_contents($htaccess_file, $rules, LOCK_EX);
    }
}

// ================================================================
// Alte Log-Dateien löschen
// ================================================================
function iv1wpt_plugin_log_cleanup($log_dir, $days = 30) {

    $log_dir = trailingslashit($log_dir);

    if (!is_dir($log_dir) || !is_readable($log_dir)) {
        return;
    }

    $max_age = time() - ((int) $days * DAY_IN_SECONDS);

    foreach (glob($log_dir . '*.log') as $file) {
        if (!is_file($file)) {
            continue;
        }

        $modified = filemtime($file);

        if ($modified !== false && $modified < $max_age) {
            @unlink($file);
        }
    }
}