// Slot generation, persistence, and API client

const ACTION_DATE = "2026-05-12"; // Dienstag, 12. Mai 2026
const SLOT_MINUTES = 15;
const SLOT_CAPACITY = 4;
const START_HOUR = 9;   // 09:00
const END_HOUR = 16;    // 16:00 (last slot starts 15:45)

// Set this to "" if frontend and worker share the same domain (Cloudflare Pages + Functions),
// or to your worker URL (e.g. "https://blutspende-api.<account>.workers.dev") if separate.
const API_BASE = "";

const ACTION_INFO = {
  title: "Blutspende CBES Lollar",
  subtitle: "Schuljahr 2025/26",
  dateLabel: "Dienstag, 12. Mai 2026",
  timeLabel: "09:00 – 16:00 Uhr",
  location: "Haus D, Clemens-Brentano-Europaschule Lollar",
  address: "Ostendstraße 2, 35457 Lollar",
  mapsUrl: "https://www.google.com/maps/search/?api=1&query=Clemens-Brentano-Europaschule+Lollar+Ostendstra%C3%9Fe+2+35457+Lollar",
  organizer: "Schulleitung & DRK-Blutspendedienst",
};

function generateSlots() {
  const slots = [];
  for (let h = START_HOUR; h < END_HOUR; h++) {
    for (let m = 0; m < 60; m += SLOT_MINUTES) {
      const hh = String(h).padStart(2, "0");
      const mm = String(m).padStart(2, "0");
      const endH = m + SLOT_MINUTES >= 60 ? h + 1 : h;
      const endM = (m + SLOT_MINUTES) % 60;
      const endHH = String(endH).padStart(2, "0");
      const endMM = String(endM).padStart(2, "0");
      slots.push({
        id: `${hh}${mm}`,
        start: `${hh}:${mm}`,
        end: `${endHH}:${endMM}`,
        hour: h,
      });
    }
  }
  return slots;
}

const ALL_SLOTS = generateSlots();

// =================================================================
// API CLIENT — talks to Cloudflare Worker (worker.js + D1 database)
// =================================================================
//
// All functions are async. The frontend uses these instead of direct
// localStorage access. If the API is unreachable (offline / not yet
// deployed), bookings fall back to a local cache so the UI still works
// for that browser, and sync once the API is back up.
//
// Endpoints:
//   GET  /api/bookings              → list all bookings
//   POST /api/bookings              → create new booking { slotId, name, email, phone, firstTime }
//   PATCH /api/bookings/:id/checkin → toggle check-in (admin only, expects "x-admin-token" header)
//
// Authentication for admin: send `X-Admin-Token: <token>` header on PATCH.
// The token is configured as a secret in the Cloudflare Worker (see worker.js).
// =================================================================

const FALLBACK_KEY = "blutspende.bookings.cache";

async function apiList() {
  const r = await fetch(`${API_BASE}/api/bookings`);
  if (!r.ok) throw new Error(`API ${r.status}`);
  return r.json();
}

async function apiCreate(data) {
  const r = await fetch(`${API_BASE}/api/bookings`, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify(data),
  });
  if (!r.ok) {
    const err = await r.json().catch(() => ({}));
    throw new Error(err.error || `API ${r.status}`);
  }
  return r.json();
}

async function apiToggleCheckin(id, adminToken) {
  const r = await fetch(`${API_BASE}/api/bookings/${id}/checkin`, {
    method: "PATCH",
    headers: { "x-admin-token": adminToken || "" },
  });
  if (!r.ok) throw new Error(`API ${r.status}`);
  return r.json();
}

async function apiDelete(id, adminToken) {
  const r = await fetch(`${API_BASE}/api/bookings/${id}`, {
    method: "DELETE",
    headers: { "x-admin-token": adminToken || "" },
  });
  if (!r.ok) throw new Error(`API ${r.status}`);
  return r.json();
}

async function apiAdminLogin(password) {
  const r = await fetch(`${API_BASE}/api/admin/login`, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({ password }),
  });
  if (!r.ok) return null;
  const data = await r.json();
  return data.token;
}

// Local fallback cache (used if the API isn't reachable yet)
function loadCache() {
  try {
    const raw = localStorage.getItem(FALLBACK_KEY);
    if (!raw) return [];
    return JSON.parse(raw);
  } catch (e) { return []; }
}
function saveCache(b) {
  try { localStorage.setItem(FALLBACK_KEY, JSON.stringify(b)); } catch (e) {}
}

function makeId() {
  return "b" + Math.random().toString(36).slice(2, 8) + Date.now().toString(36).slice(-3);
}

// ICS generator
function buildICS(booking, slot) {
  const dt = ACTION_DATE.replace(/-/g, "");
  const start = dt + "T" + slot.start.replace(":", "") + "00";
  const end = dt + "T" + slot.end.replace(":", "") + "00";
  const stamp = new Date().toISOString().replace(/[-:.]/g, "").slice(0, 15) + "Z";
  return [
    "BEGIN:VCALENDAR",
    "VERSION:2.0",
    "PRODID:-//CBES Lollar Blutspende//DE",
    "BEGIN:VEVENT",
    `UID:${booking.id}@cbes-lollar-blutspende`,
    `DTSTAMP:${stamp}`,
    `DTSTART;TZID=Europe/Berlin:${start}`,
    `DTEND;TZID=Europe/Berlin:${end}`,
    `SUMMARY:Blutspende-Termin – ${ACTION_INFO.title}`,
    `LOCATION:${ACTION_INFO.location}, ${ACTION_INFO.address}`,
    `DESCRIPTION:Bitte 15 Min. vorher da sein. Personalausweis mitbringen. Bestätigung: ${booking.id}`,
    "END:VEVENT",
    "END:VCALENDAR",
  ].join("\r\n");
}

function downloadICS(booking, slot) {
  const text = buildICS(booking, slot);
  const blob = new Blob([text], { type: "text/calendar;charset=utf-8" });
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = `blutspende-${slot.start.replace(":","")}.ics`;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  setTimeout(() => URL.revokeObjectURL(url), 1000);
}

Object.assign(window, {
  ACTION_DATE, ACTION_INFO, ALL_SLOTS, SLOT_CAPACITY,
  apiList, apiCreate, apiToggleCheckin, apiDelete, apiAdminLogin,
  loadCache, saveCache, makeId, downloadICS,
});
