<?php
// ============================================================
//  api.php  –  REST API voor familiefeest  (v1.4)
// ============================================================

// Stuur altijd JSON headers als eerste, zodat fouten ook als JSON komen
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

require_once __DIR__ . '/config.php';

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    http_response_code(500);
    echo json_encode(['error' => "PHP fout ($errno): $errstr op regel $errline"]);
    exit;
});

try {
    $db = getDB();
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => 'DB verbinding mislukt: ' . $e->getMessage()]);
    exit;
}

$method   = $_SERVER['REQUEST_METHOD'];
$resource = $_GET['resource'] ?? '';
$id       = isset($_GET['id']) ? (int)$_GET['id'] : null;
$rawBody  = file_get_contents('php://input');
$body     = $rawBody ? (json_decode($rawBody, true) ?? []) : [];

// ----------------------------------------------------------------
//  PEOPLE
// ----------------------------------------------------------------
if ($resource === 'people') {

    if ($method === 'GET') {
        try {
            $rows = $db->query('SELECT * FROM people ORDER BY birth_year ASC, lname, fname')->fetchAll();
            jsonResponse($rows);
        } catch (PDOException $e) {
            jsonError('DB fout people GET: ' . $e->getMessage());
        }
    }

    if ($method === 'POST') {
        try {
            $s = $db->prepare(
                'INSERT INTO people (fname, lname, gender, birth_year, parent_id, email, gsm, deceased, death_year)
                 VALUES (:fname, :lname, :gender, :year, :parent, :email, :gsm, :deceased, :death_year)'
            );
            $s->execute([
                ':fname'      => trim($body['fname'] ?? ''),
                ':lname'      => trim($body['lname'] ?? ''),
                ':gender'     => in_array($body['gender'] ?? '', ['m','v']) ? $body['gender'] : 'm',
                ':year'       => !empty($body['birth_year'])  ? (int)$body['birth_year']  : null,
                ':parent'     => !empty($body['parent_id'])   ? (int)$body['parent_id']   : null,
                ':email'      => trim($body['email'] ?? '') ?: null,
                ':gsm'        => trim($body['gsm']   ?? '') ?: null,
                ':deceased'   => !empty($body['deceased'])    ? 1 : 0,
                ':death_year' => !empty($body['death_year'])  ? (int)$body['death_year']  : null,
            ]);
            $newId = (int)$db->lastInsertId();
            $row = $db->query("SELECT * FROM people WHERE id = $newId")->fetch();
            jsonResponse($row, 201);
        } catch (PDOException $e) {
            jsonError('DB fout people POST: ' . $e->getMessage());
        }
    }

    if ($method === 'PUT' && $id) {
        try {
            $s = $db->prepare(
                'UPDATE people
                 SET fname=:fname, lname=:lname, gender=:gender,
                     birth_year=:year, parent_id=:parent,
                     email=:email, gsm=:gsm,
                     deceased=:deceased, death_year=:death_year
                 WHERE id=:id'
            );
            $s->execute([
                ':fname'      => trim($body['fname'] ?? ''),
                ':lname'      => trim($body['lname'] ?? ''),
                ':gender'     => in_array($body['gender'] ?? '', ['m','v']) ? $body['gender'] : 'm',
                ':year'       => !empty($body['birth_year'])  ? (int)$body['birth_year']  : null,
                ':parent'     => !empty($body['parent_id'])   ? (int)$body['parent_id']   : null,
                ':email'      => trim($body['email'] ?? '') ?: null,
                ':gsm'        => trim($body['gsm']   ?? '') ?: null,
                ':deceased'   => !empty($body['deceased'])    ? 1 : 0,
                ':death_year' => !empty($body['death_year'])  ? (int)$body['death_year']  : null,
                ':id'         => $id,
            ]);
            $row = $db->query("SELECT * FROM people WHERE id = $id")->fetch();
            jsonResponse($row ?: ['error' => 'Niet gevonden'], $row ? 200 : 404);
        } catch (PDOException $e) {
            jsonError('DB fout people PUT: ' . $e->getMessage());
        }
    }

    if ($method === 'DELETE' && $id) {
        try {
            $db->prepare('DELETE FROM people WHERE id = ?')->execute([$id]);
            jsonResponse(['deleted' => $id]);
        } catch (PDOException $e) {
            jsonError('DB fout people DELETE: ' . $e->getMessage());
        }
    }

    jsonError('Methode niet toegestaan voor people', 405);
}

// ----------------------------------------------------------------
//  COUPLES
// ----------------------------------------------------------------
if ($resource === 'couples') {

    if ($method === 'GET') {
        try {
            $rows = $db->query('SELECT * FROM couples ORDER BY marry_year')->fetchAll();
            jsonResponse($rows);
        } catch (PDOException $e) {
            jsonError('DB fout couples GET: ' . $e->getMessage());
        }
    }

    if ($method === 'POST') {
        try {
            $p1 = (int)($body['partner1_id'] ?? 0);
            $p2 = (int)($body['partner2_id'] ?? 0);
            if (!$p1 || !$p2 || $p1 === $p2) jsonError('Ongeldige partners');
            if ($p1 > $p2) { $tmp = $p1; $p1 = $p2; $p2 = $tmp; }
            $db->prepare('DELETE FROM couples WHERE partner1_id IN(?,?) OR partner2_id IN(?,?)')
               ->execute([$p1, $p2, $p1, $p2]);
            $s = $db->prepare('INSERT INTO couples (partner1_id, partner2_id, marry_year) VALUES(?, ?, ?)');
            $s->execute([$p1, $p2, !empty($body['marry_year']) ? (int)$body['marry_year'] : null]);
            $newId = (int)$db->lastInsertId();
            $row = $db->query("SELECT * FROM couples WHERE id = $newId")->fetch();
            jsonResponse($row, 201);
        } catch (PDOException $e) {
            jsonError('DB fout couples POST: ' . $e->getMessage());
        }
    }

    if ($method === 'DELETE' && $id) {
        try {
            $db->prepare('DELETE FROM couples WHERE id = ?')->execute([$id]);
            jsonResponse(['deleted' => $id]);
        } catch (PDOException $e) {
            jsonError('DB fout couples DELETE: ' . $e->getMessage());
        }
    }

    jsonError('Methode niet toegestaan voor couples', 405);
}

// ----------------------------------------------------------------
//  REGISTRATIONS
// ----------------------------------------------------------------
if ($resource === 'registrations') {

    if ($method === 'GET') {
        try {
            $sql = 'SELECT r.*, CONCAT(p.fname, " ", p.lname) AS naam, p.email, p.gsm
                    FROM registrations r
                    JOIN people p ON p.id = r.person_id
                    ORDER BY r.updated_at DESC';
            jsonResponse($db->query($sql)->fetchAll());
        } catch (PDOException $e) {
            jsonError('DB fout registrations GET: ' . $e->getMessage());
        }
    }

    if ($method === 'POST' || ($method === 'PUT' && $id)) {
        try {
            $personId  = (int)($body['person_id'] ?? 0);
            $attending = $body['attending'] ?? '';
            if (!$personId) jsonError('Geen geldig person_id');
            if (!in_array($attending, ['coming', 'not-coming'])) jsonError('Ongeldige attending waarde');
            $s = $db->prepare(
                'INSERT INTO registrations (person_id, attending, padel, dinner, menu, remarks)
                 VALUES (:person_id, :attending, :padel, :dinner, :menu, :remarks)
                 ON DUPLICATE KEY UPDATE
                   attending = VALUES(attending),
                   padel     = VALUES(padel),
                   dinner    = VALUES(dinner),
                   menu      = VALUES(menu),
                   remarks   = VALUES(remarks)'
            );
            $s->execute([
                'person_id' => $personId,
                'attending' => $attending,
                'padel'     => in_array($body['padel']  ?? '', ['yes','no'])             ? $body['padel']  : null,
                'dinner'    => in_array($body['dinner'] ?? '', ['yes','no'])             ? $body['dinner'] : null,
                'menu'      => !empty($body['menu']) ? trim($body['menu']) : null,
                'remarks'   => !empty($body['remarks']) ? $body['remarks'] : null,
            ]);
            jsonResponse(['ok' => true]);
        } catch (PDOException $e) {
            jsonError('DB fout registrations POST: ' . $e->getMessage());
        }
    }

    jsonError('Methode niet toegestaan voor registrations', 405);
}

jsonError('Onbekende resource: ' . htmlspecialchars($resource), 404);
