<?php
session_start();
require_once __DIR__ . '/db.php';

if (!isset($_SESSION['wedding_access']) || $_SESSION['wedding_access'] !== true) {
    header("Location: index.php");
    exit;
}

$guestId = isset($_POST['guest_id']) ? (int)$_POST['guest_id'] : 0;
$imePrezime = trim($_POST['ime_prezime'] ?? '');
$status = $_POST['status'] ?? 'pending';

$pratiociIdsRaw = trim($_POST['pratioci_ids'] ?? '');
$pratiociNamesRaw = trim($_POST['pratioci_names'] ?? '');

$allowedStatuses = ['pending', 'potvrdjeno', 'otkazano'];

if ($imePrezime === '' || !in_array($status, $allowedStatuses, true)) {
    die("Neispravan unos.");
}

try {
    $pdo->beginTransaction();

    /*
        1. Prvo pokušavamo pronaći nosioca preko guest_id.
        Ako guest_id nije poslan, tražimo po imenu i prezimenu.
    */

    $guest = null;

    if ($guestId > 0) {
        $stmt = $pdo->prepare("
            SELECT *
            FROM zvanice
            WHERE id = ?
            AND nosioc = 1
            LIMIT 1
        ");
        $stmt->execute([$guestId]);
        $guest = $stmt->fetch();
    }

    if (!$guest) {
        $stmt = $pdo->prepare("
            SELECT *
            FROM zvanice
            WHERE LOWER(ime_prezime) = LOWER(?)
            AND nosioc = 1
            LIMIT 1
        ");
        $stmt->execute([$imePrezime]);
        $guest = $stmt->fetch();
    }

    /*
        2. Ako osoba ne postoji u bazi, možemo je dodati kao novog nosioca.
        Ako ne želiš da nepoznati ljudi mogu sami dodavati sebe, reći ću ti šta da izbrišeš.
    */

    if (!$guest) {
        $stmt = $pdo->prepare("
            INSERT INTO zvanice 
            (ime_prezime, status, broj_zvanica, nosioc, nosioc_id)
            VALUES (?, ?, 1, 1, NULL)
        ");
        $stmt->execute([$imePrezime, $status]);

        $guestId = (int)$pdo->lastInsertId();
        $brojZvanica = 1;
    } else {
        $guestId = (int)$guest['id'];
        $brojZvanica = (int)$guest['broj_zvanica'];

        $stmt = $pdo->prepare("
            UPDATE zvanice
            SET status = ?
            WHERE id = ?
        ");
        $stmt->execute([$status, $guestId]);
    }

    /*
        3. Ako je osoba kliknula NE,
        nosioc i svi njegovi pratioci idu na otkazano.
    */

    if ($status === 'otkazano') {
        $stmt = $pdo->prepare("
            UPDATE zvanice
            SET status = 'otkazano'
            WHERE nosioc_id = ?
        ");
        $stmt->execute([$guestId]);

        $pdo->commit();

        header("Location: index.php?success=1");
        exit;
    }

    /*
        4. Ako je osoba kliknula DA,
        obrađujemo pratioce.
    */

    $maxPratilaca = max(0, $brojZvanica - 1);

    $selectedIds = [];

    if ($pratiociIdsRaw !== '') {
        $selectedIds = array_filter(array_map('intval', explode(',', $pratiociIdsRaw)));
        $selectedIds = array_slice($selectedIds, 0, $maxPratilaca);
    }

    $selectedNames = [];

    if ($pratiociNamesRaw !== '') {
        $selectedNames = preg_split('/\r\n|\r|\n/', $pratiociNamesRaw);
        $selectedNames = array_values(array_filter(array_map('trim', $selectedNames)));
        $selectedNames = array_slice($selectedNames, 0, $maxPratilaca);
    }

    /*
        5. Prvo sve postojeće pratioce tog nosioca vraćamo na pending.
        Nakon toga potvrđujemo samo one koji su odabrani/upisani.
    */

    if ($maxPratilaca > 0) {
        $stmt = $pdo->prepare("
            UPDATE zvanice
            SET status = 'pending'
            WHERE nosioc_id = ?
        ");
        $stmt->execute([$guestId]);
    }

    /*
        6. Potvrdi postojeće pratioce koji su odabrani iz popup prijedloga.
    */

    if (!empty($selectedIds)) {
        $placeholders = implode(',', array_fill(0, count($selectedIds), '?'));

        $params = array_merge([$guestId], $selectedIds);

        $stmt = $pdo->prepare("
            UPDATE zvanice
            SET status = 'potvrdjeno'
            WHERE nosioc_id = ?
            AND id IN ($placeholders)
        ");
        $stmt->execute($params);
    }

    /*
        7. Ako je pratilac ručno upisan, dodaj ga ili potvrdi ako već postoji.
    */

    foreach ($selectedNames as $name) {
        if ($name === '') {
            continue;
        }

        // Ne dozvoli da osoba sama sebe doda kao pratioca
        if (mb_strtolower($name, 'UTF-8') === mb_strtolower($imePrezime, 'UTF-8')) {
            continue;
        }

        $stmt = $pdo->prepare("
            SELECT id
            FROM zvanice
            WHERE nosioc_id = ?
            AND LOWER(ime_prezime) = LOWER(?)
            LIMIT 1
        ");
        $stmt->execute([$guestId, $name]);
        $existingCompanion = $stmt->fetch();

        if ($existingCompanion) {
            $stmt = $pdo->prepare("
                UPDATE zvanice
                SET status = 'potvrdjeno'
                WHERE id = ?
            ");
            $stmt->execute([(int)$existingCompanion['id']]);
        } else {
            $stmt = $pdo->prepare("
                INSERT INTO zvanice 
                (ime_prezime, status, broj_zvanica, nosioc, nosioc_id)
                VALUES (?, 'potvrdjeno', 1, 0, ?)
            ");
            $stmt->execute([$name, $guestId]);
        }
    }

    $pdo->commit();

   if (
	!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
	strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'
) {
	header('Content-Type: application/json; charset=utf-8');
	echo json_encode([
		'success' => true,
		'message' => 'Potvrda je uspješno evidentirana.'
	], JSON_UNESCAPED_UNICODE);
	exit;
}

header("Location: index.php?success=1");
exit;

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }

    die("Greška: " . $e->getMessage());
}