// Pray for Greece API (Cloudflare Worker + D1 database bound as "DB")
// GET  /api/prayers/:key         -> {count}   key = YYYY-MM-DD (365-day plan) or c1..c100 (100-day plan)
// POST /api/prayers {date, visitor_id}            -> {count}
// GET  /api/adoptions/:id        -> {count}   id = 1–365 (365-day plan) or 1001–1100 (100-day plan); never returns names or emails
// POST /api/adoptions {day, place, name, email, lang} -> {count}
const ORIGINS = ["https://prayforgreece.com", "https://www.prayforgreece.com"];

function cors(req) {
  const o = req.headers.get("Origin") || "";
  return {
    "Access-Control-Allow-Origin": ORIGINS.includes(o) ? o : ORIGINS[0],
    "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
    "Access-Control-Allow-Headers": "content-type",
    "Vary": "Origin",
  };
}
const json = (req, data, status = 200) =>
  new Response(JSON.stringify(data), { status, headers: { "content-type": "application/json", ...cors(req) } });

export default {
  async fetch(req, env) {
    if (req.method === "OPTIONS") return new Response(null, { headers: cors(req) });
    const url = new URL(req.url);
    const p = url.pathname.replace(/\/+$/, "");
    try {
      let m;
      if ((m = p.match(/^\/api\/prayers\/(\d{4}-\d{2}-\d{2}|c\d{1,3})$/)) && req.method === "GET") {
        const r = await env.DB.prepare("SELECT COUNT(*) AS n FROM prayers WHERE date = ?").bind(m[1]).first();
        return json(req, { count: r.n });
      }
      if (p === "/api/prayers" && req.method === "POST") {
        const b = await req.json();
        if (!/^(\d{4}-\d{2}-\d{2}|c\d{1,3})$/.test(b.date || "") || typeof b.visitor_id !== "string" || b.visitor_id.length < 4 || b.visitor_id.length > 64)
          return json(req, { error: "bad request" }, 400);
        await env.DB.prepare("INSERT OR IGNORE INTO prayers (date, visitor_id) VALUES (?, ?)").bind(b.date, b.visitor_id).run();
        const r = await env.DB.prepare("SELECT COUNT(*) AS n FROM prayers WHERE date = ?").bind(b.date).first();
        return json(req, { count: r.n });
      }
      if ((m = p.match(/^\/api\/adoptions\/(\d{1,4})$/)) && req.method === "GET") {
        const r = await env.DB.prepare("SELECT COUNT(*) AS n FROM adoptions WHERE day = ?").bind(+m[1]).first();
        return json(req, { count: r.n });
      }
      if (p === "/api/adoptions" && req.method === "POST") {
        const b = await req.json();
        const day = +b.day, name = String(b.name || "").trim().slice(0, 60), email = String(b.email || "").trim().toLowerCase().slice(0, 120);
        const place = String(b.place || "").slice(0, 120), lang = b.lang === "el" ? "el" : "en";
        if (!((day >= 1 && day <= 365) || (day >= 1001 && day <= 1100)) || !name || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email))
          return json(req, { error: "bad request" }, 400);
        await env.DB.prepare("INSERT OR IGNORE INTO adoptions (day, place, name, email, lang) VALUES (?, ?, ?, ?, ?)")
          .bind(day, place, name, email, lang).run();
        const r = await env.DB.prepare("SELECT COUNT(*) AS n FROM adoptions WHERE day = ?").bind(day).first();
        return json(req, { count: r.n });
      }
      return json(req, { error: "not found" }, 404);
    } catch (e) {
      return json(req, { error: "server error" }, 500);
    }
  },
};
