<?php
// ============================================================
//  admin/event-edit.php — Create / edit / delete calendar event
// ============================================================

require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/csrf.php';
require_once __DIR__ . '/../includes/config.php';
auth_require_admin();

$me = auth_admin_user();
$id = (int)($_GET['id'] ?? 0);

// Friendly error if migration hasn't been run yet
try {
    db_value("SELECT 1 FROM calendar_events LIMIT 1");
} catch (Throwable $e) {
    $page_title = 'Event setup needed';
    require __DIR__ . '/_guard.php';
    ?>
    <section class="section"><div class="container" style="max-width:600px;">
        <div style="background:#fef2f2;border:1px solid #fca5a5;color:#991b1b;padding:1.25rem;border-radius:8px;">
            <h2 style="margin:0 0 .5rem;">Calendar events table missing</h2>
            <p style="margin:0 0 .5rem;">The <code>calendar_events</code> table doesn't exist yet. Please run the migration:</p>
            <p style="margin:0 0 .5rem;font-family:monospace;background:#fff;padding:.5rem;border-radius:4px;">db/schema-2g13.sql</p>
            <p style="margin:0;font-size:.85rem;color:#7f1d1d;">Error: <?= htmlspecialchars($e->getMessage()) ?></p>
        </div>
        <p style="margin-top:1rem;">
            <a href="calendar.php" class="btn btn-outline">← Back to calendar</a>
        </p>
    </div></section>
    <?php require __DIR__ . '/_footer.php';
    exit;
}

$event = null;
if ($id) {
    try {
        $event = db_row('SELECT * FROM calendar_events WHERE id = :id', ['id' => $id]);
    } catch (Throwable $e) {
        http_response_code(500);
        exit('Database error: ' . htmlspecialchars($e->getMessage()));
    }
    if (!$event) { http_response_code(404); exit('Event not found.'); }
}

$flash_error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_verify();
    $action = $_POST['action'] ?? 'save';

    if ($action === 'delete' && $event) {
        db_exec('DELETE FROM calendar_events WHERE id = :id', ['id' => $event['id']]);
        header('Location: calendar.php?msg=' . urlencode('Event deleted.'));
        exit;
    }

    // Save / update
    $title = trim((string)($_POST['title'] ?? ''));
    $is_all_day      = !empty($_POST['is_all_day']);
    $show_to_members = !empty($_POST['show_to_members']);

    $sd = trim((string)($_POST['starts_at_date'] ?? ''));
    $st = trim((string)($_POST['starts_at_time'] ?? ''));
    $ed = trim((string)($_POST['ends_at_date']   ?? ''));
    $et = trim((string)($_POST['ends_at_time']   ?? ''));

    if ($title === '') {
        $flash_error = 'Title is required.';
    } elseif (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $sd)) {
        $flash_error = 'Start date is required.';
    } elseif ($ed !== '' && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $ed)) {
        $flash_error = 'End date format invalid.';
    } else {
        if ($is_all_day) {
            // All-day → store midnight to end-of-day
            $starts_at = $sd . ' 00:00:00';
            $ends_at   = $ed !== '' ? $ed . ' 23:59:59' : $sd . ' 23:59:59';
        } else {
            if (!preg_match('/^\d{2}:\d{2}$/', $st)) $st = '09:00';
            $starts_at = $sd . ' ' . $st . ':00';
            if ($ed !== '') {
                if (!preg_match('/^\d{2}:\d{2}$/', $et)) $et = '10:00';
                $ends_at = $ed . ' ' . $et . ':00';
            } else {
                $ends_at = null;
            }
        }

        // Sanity: if end is before start, swap
        if ($ends_at && strtotime($ends_at) < strtotime($starts_at)) {
            $flash_error = 'End date/time is before start date/time.';
        } else {
            $payload = [
                'title'           => mb_substr($title, 0, 200),
                'starts_at'       => $starts_at,
                'ends_at'         => $ends_at,
                'is_all_day'      => $is_all_day ? 1 : 0,
                'show_to_members' => $show_to_members ? 1 : 0,
            ];

            try {
                if ($event) {
                    db_exec(
                        "UPDATE calendar_events
                            SET title = :title,
                                starts_at = :starts_at,
                                ends_at = :ends_at,
                                is_all_day = :is_all_day,
                                show_to_members = :show_to_members
                          WHERE id = :id",
                        $payload + ['id' => $event['id']]
                    );
                } else {
                    db_insert('calendar_events', $payload + ['created_by' => $me['id']]);
                }

                // Redirect back to calendar, focused on the event's month
                $y = (int)date('Y', strtotime($starts_at));
                $m = (int)date('n', strtotime($starts_at));
                header("Location: calendar.php?y={$y}&m={$m}&msg=" . urlencode($event ? 'Event updated.' : 'Event added.'));
                exit;
            } catch (Throwable $e) {
                $flash_error = 'Save failed: ' . $e->getMessage();
                if (function_exists('app_log')) app_log('event save failed: ' . $e->getMessage());
            }
        }
    }
}

// Pre-fill values
if ($event) {
    $v_title  = $event['title'];
    $v_allday = (bool)$event['is_all_day'];
    $v_show   = (bool)$event['show_to_members'];
    $v_sd = date('Y-m-d', strtotime($event['starts_at']));
    $v_st = date('H:i',   strtotime($event['starts_at']));
    if (!empty($event['ends_at'])) {
        $v_ed = date('Y-m-d', strtotime($event['ends_at']));
        $v_et = date('H:i',   strtotime($event['ends_at']));
        // If the end is set to 23:59:59 from a single-day all-day event,
        // and the start is the same day at midnight, treat as "no end"
        if ($v_allday && $v_ed === $v_sd) {
            $v_ed = '';
            $v_et = '';
        }
    } else {
        $v_ed = '';
        $v_et = '';
    }
} else {
    $v_title  = '';
    $v_allday = true;
    $v_show   = true;
    $v_sd = $_GET['date'] ?? date('Y-m-d');
    $v_st = '09:00';
    $v_ed = '';
    $v_et = '10:00';
}

// Preserve POSTed values on error
if ($flash_error) {
    $v_title  = $_POST['title'] ?? $v_title;
    $v_allday = !empty($_POST['is_all_day']);
    $v_show   = !empty($_POST['show_to_members']);
    $v_sd = $_POST['starts_at_date'] ?? $v_sd;
    $v_st = $_POST['starts_at_time'] ?? $v_st;
    $v_ed = $_POST['ends_at_date']   ?? $v_ed;
    $v_et = $_POST['ends_at_time']   ?? $v_et;
}

$page_title = $event ? 'Edit event' : 'New event';
require __DIR__ . '/_guard.php';
?>

<style>
.ev-wrap{max-width:680px;margin:0 auto;}
.ev-card{background:#fff;border:1px solid var(--line);border-radius:8px;padding:1.5rem;}
.ev-card h1{margin:0 0 .5rem;}
.ev-card .lead{margin:0 0 1.5rem;color:var(--ink-muted);font-size:.88rem;}

.ev-row{margin-bottom:1.1rem;}
.ev-row label{display:block;font-weight:600;font-size:.86rem;margin-bottom:.35rem;}
.ev-row input[type="text"],
.ev-row input[type="date"],
.ev-row input[type="time"]{
    width:100%;padding:.55rem .75rem;border:1px solid var(--line);
    border-radius:5px;font-size:.92rem;font-family:inherit;
}
.ev-row input[type="text"]:focus,
.ev-row input[type="date"]:focus,
.ev-row input[type="time"]:focus{
    outline:none;border-color:var(--brand-primary);
    box-shadow:0 0 0 3px rgba(99,102,241,.12);
}

.ev-toggles{display:flex;gap:1.25rem;flex-wrap:wrap;margin-bottom:1.1rem;}
.ev-toggle{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.9rem;}
.ev-toggle input[type="checkbox"]{width:16px;height:16px;}

.ev-time-row{display:grid;grid-template-columns:1fr 110px;gap:.5rem;}
@media(max-width:520px){.ev-time-row{grid-template-columns:1fr;}}
.ev-time-hidden{display:none;}

.ev-foot{display:flex;justify-content:space-between;align-items:center;gap:.75rem;margin-top:1.5rem;flex-wrap:wrap;}
.ev-foot .left{display:flex;gap:.5rem;align-items:center;}

.flash{padding:.7rem 1rem;border-radius:6px;margin-bottom:1rem;font-size:.88rem;background:#fef2f2;color:#991b1b;border:1px solid #fca5a5;}

.ev-hint{font-size:.78rem;color:var(--ink-muted);margin-top:.3rem;}
</style>

<section class="section"><div class="container ev-wrap">

<p style="margin:0 0 .75rem;">
    <a href="calendar.php" style="color:var(--ink-muted);text-decoration:none;font-size:.86rem;">← Back to calendar</a>
</p>

<?php if ($flash_error): ?>
    <div class="flash"><?= htmlspecialchars($flash_error) ?></div>
<?php endif; ?>

<div class="ev-card">
    <h1><?= htmlspecialchars($event ? 'Edit event' : 'New event') ?></h1>
    <p class="lead">
        <?= $event
            ? 'Update the details below.'
            : 'Add an event to the calendar. Toggle "Show to members" to make it visible on the member calendar.' ?>
    </p>

    <form method="post" id="ev-form">
        <?= csrf_field() ?>

        <div class="ev-row">
            <label for="title">Event name</label>
            <input type="text" name="title" id="title" maxlength="200" required
                   value="<?= htmlspecialchars($v_title) ?>"
                   placeholder="e.g. Lowveld Market Day">
        </div>

        <div class="ev-toggles">
            <label class="ev-toggle">
                <input type="checkbox" name="is_all_day" id="is_all_day" value="1"
                       <?= $v_allday ? 'checked' : '' ?>>
                <span>All-day event</span>
            </label>
            <label class="ev-toggle">
                <input type="checkbox" name="show_to_members" value="1"
                       <?= $v_show ? 'checked' : '' ?>>
                <span>Show to members</span>
            </label>
        </div>

        <div class="ev-row">
            <label>Starts</label>
            <div class="ev-time-row">
                <input type="date" name="starts_at_date" required
                       value="<?= htmlspecialchars($v_sd) ?>">
                <input type="time" name="starts_at_time" id="starts_at_time"
                       class="<?= $v_allday ? 'ev-time-hidden' : '' ?>"
                       value="<?= htmlspecialchars($v_st) ?>">
            </div>
        </div>

        <div class="ev-row">
            <label>Ends <span style="color:var(--ink-muted);font-weight:normal;">(optional)</span></label>
            <div class="ev-time-row">
                <input type="date" name="ends_at_date"
                       value="<?= htmlspecialchars($v_ed) ?>">
                <input type="time" name="ends_at_time" id="ends_at_time"
                       class="<?= $v_allday ? 'ev-time-hidden' : '' ?>"
                       value="<?= htmlspecialchars($v_et) ?>">
            </div>
            <p class="ev-hint">Leave blank for a single-day event. For multi-day, pick the last day.</p>
        </div>

        <div class="ev-foot">
            <div class="left">
                <button type="submit" name="action" value="save" class="btn">
                    <?= $event ? 'Save changes' : 'Add event' ?>
                </button>
                <a href="calendar.php" class="btn btn-outline">Cancel</a>
            </div>

            <?php if ($event): ?>
                <button type="submit" name="action" value="delete"
                        onclick="return confirm('Delete this event? This cannot be undone.');"
                        class="btn btn-outline" style="color:#991b1b;border-color:#fca5a5;">
                    Delete event
                </button>
            <?php endif; ?>
        </div>
    </form>
</div>

</div></section>

<script>
// Toggle time input visibility when "All-day" is checked
(function() {
    const cb = document.getElementById('is_all_day');
    const t1 = document.getElementById('starts_at_time');
    const t2 = document.getElementById('ends_at_time');
    cb.addEventListener('change', () => {
        if (cb.checked) {
            t1.classList.add('ev-time-hidden');
            t2.classList.add('ev-time-hidden');
        } else {
            t1.classList.remove('ev-time-hidden');
            t2.classList.remove('ev-time-hidden');
        }
    });
})();
</script>

<?php require __DIR__ . '/_footer.php'; ?>