<?php
// duplicate_packing_list.php - Logik zum Duplizieren einer kompletten Packliste

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

require_once 'db_connect.php';
$current_user_id = $_SESSION['user_id'];
$original_list_id = isset($_GET['id']) ? intval($_GET['id']) : 0;

if ($original_list_id <= 0) {
    $_SESSION['message'] = '<div class="alert alert-danger" role="alert">Ungültige Packlisten-ID zum Duplizieren.</div>';
    header("Location: packing_lists.php");
    exit;
}

$conn->begin_transaction();

try {
    // 1. Originale Packliste abrufen, um den Namen zu bekommen und die Berechtigung zu prüfen
    $stmt_original = $conn->prepare("SELECT name, description FROM packing_lists WHERE id = ? AND user_id = ?");
    $stmt_original->bind_param("ii", $original_list_id, $current_user_id);
    $stmt_original->execute();
    $result_original = $stmt_original->get_result();
    if ($result_original->num_rows === 0) {
        throw new Exception("Originale Packliste nicht gefunden oder keine Berechtigung.");
    }
    $original_list = $result_original->fetch_assoc();
    $stmt_original->close();

    // 2. Neuen Namen für die Kopie finden (z.B. "Tour (Kopie 1)", "Tour (Kopie 2)", etc.)
    $base_name = $original_list['name'];
    $copy_name = '';
    $copy_number = 1;
    while (true) {
        $suffix = " (Kopie " . $copy_number . ")";
        $test_name = $base_name . $suffix;
        
        $stmt_check_name = $conn->prepare("SELECT id FROM packing_lists WHERE name = ? AND user_id = ?");
        $stmt_check_name->bind_param("si", $test_name, $current_user_id);
        $stmt_check_name->execute();
        $stmt_check_name->store_result();
        
        if ($stmt_check_name->num_rows === 0) {
            $copy_name = $test_name;
            $stmt_check_name->close();
            break;
        }
        $stmt_check_name->close();
        $copy_number++;
    }

    // 3. Neue Packliste in die `packing_lists` Tabelle einfügen
    $stmt_new_list = $conn->prepare("INSERT INTO packing_lists (user_id, name, description) VALUES (?, ?, ?)");
    $stmt_new_list->bind_param("iss", $current_user_id, $copy_name, $original_list['description']);
    if (!$stmt_new_list->execute()) throw new Exception("Fehler beim Erstellen des Listenkopfeintrags.");
    $new_list_id = $conn->insert_id;
    $stmt_new_list->close();

    // KORREKTUR: Komplette Überarbeitung der Kopierlogik
    
    // 4. Alle Artikel aus der originalen Liste mit ihrer ID holen
    $stmt_items = $conn->prepare("SELECT id, article_id, quantity, parent_packing_list_item_id, carrier_user_id FROM packing_list_items WHERE packing_list_id = ?");
    $stmt_items->bind_param("i", $original_list_id);
    $stmt_items->execute();
    $result_items = $stmt_items->get_result();
    $original_items = [];
    while ($row = $result_items->fetch_assoc()) {
        $original_items[] = $row;
    }
    $stmt_items->close();

    if (!empty($original_items)) {
        // 5. Hierarchie-Klonen in zwei Schritten
        $old_to_new_id_map = []; // Speichert [alte_item_id] => neue_item_id

        // Schritt 5a: Alle Items ohne Parent-Info kopieren und die ID-Zuordnung speichern
        $stmt_insert_item = $conn->prepare("INSERT INTO packing_list_items (packing_list_id, article_id, quantity, carrier_user_id) VALUES (?, ?, ?, ?)");
        if (!$stmt_insert_item) throw new Exception("DB Prepare Fehler (Item Insert)");

        foreach ($original_items as $item) {
            $stmt_insert_item->bind_param("iiii", $new_list_id, $item['article_id'], $item['quantity'], $item['carrier_user_id']);
            if (!$stmt_insert_item->execute()) throw new Exception("Fehler beim Kopieren von Artikel ID " . $item['article_id']);
            $new_item_id = $conn->insert_id;
            $old_to_new_id_map[$item['id']] = $new_item_id;
        }
        $stmt_insert_item->close();

        // Schritt 5b: Die Parent-IDs für die neu erstellten Items aktualisieren
        $stmt_update_parent = $conn->prepare("UPDATE packing_list_items SET parent_packing_list_item_id = ? WHERE id = ?");
        if (!$stmt_update_parent) throw new Exception("DB Prepare Fehler (Parent Update)");

        foreach ($original_items as $item) {
            // Wenn das Original-Item einen Parent hatte...
            if (!empty($item['parent_packing_list_item_id'])) {
                $old_parent_id = $item['parent_packing_list_item_id'];
                
                // Stelle sicher, dass der Parent auch in unserer Map existiert
                if (isset($old_to_new_id_map[$old_parent_id])) {
                    $new_parent_id = $old_to_new_id_map[$old_parent_id];
                    $new_child_id = $old_to_new_id_map[$item['id']];

                    $stmt_update_parent->bind_param("ii", $new_parent_id, $new_child_id);
                    if (!$stmt_update_parent->execute()) throw new Exception("Fehler beim Setzen der Hierarchie für Item " . $new_child_id);
                }
            }
        }
        $stmt_update_parent->close();
    }
    
    $conn->commit();
    $_SESSION['message'] = '<div class="alert alert-success" role="alert">Packliste erfolgreich zu "'.$copy_name.'" dupliziert!</div>';

} catch (Exception $e) {
    $conn->rollback();
    $_SESSION['message'] = '<div class="alert alert-danger" role="alert">Fehler beim Duplizieren: ' . $e->getMessage() . '</div>';
    // NEU: Logge den tatsächlichen Fehler für den Admin
    error_log("Fehler beim Duplizieren der Packliste: " . $e->getMessage());
}

header("Location: packing_lists.php");
exit;
?>
