export const prerender = false;
import type { APIContext } from 'astro';
import { isAuthenticated, ADMIN_COOKIE } from '@admin/lib/admin-auth';
interface Env { DB: D1Database }

function json(data: unknown, status = 200) {
  return new Response(JSON.stringify(data), { status, headers: { 'Content-Type': 'application/json' } });
}

// GET /api/admin/genres - list all genres with aliases
export async function GET({ locals, cookies }: APIContext) {
  const runtime = locals.runtime as { env: Env } | undefined;
  const db = runtime?.env?.DB;
  if (!db) return json({ error: 'no db' }, 503);
  if (!await isAuthenticated(cookies.get(ADMIN_COOKIE)?.value, db)) return json({ error: 'unauthorized' }, 401);

  const genres = await db.prepare(`
    SELECT g.id, g.name_en, g.name_ar, g.name_ku, g.sort_order,
           COUNT(a.alias) as alias_count
    FROM genres g
    LEFT JOIN genre_aliases a ON a.genre_id = g.id
    GROUP BY g.id
    ORDER BY g.sort_order, g.name_en
  `).all();

  return json({ genres: genres.results });
}

// POST /api/admin/genres - create new genre
export async function POST({ locals, cookies, request }: APIContext) {
  const runtime = locals.runtime as { env: Env } | undefined;
  const db = runtime?.env?.DB;
  if (!db) return json({ error: 'no db' }, 503);
  if (!await isAuthenticated(cookies.get(ADMIN_COOKIE)?.value, db)) return json({ error: 'unauthorized' }, 401);

  const body = await request.json() as { id?: string; name_en?: string; name_ar?: string; name_ku?: string; sort_order?: number };
  const { id, name_en, name_ar, name_ku, sort_order = 0 } = body;
  if (!id || !name_en) return json({ error: 'id and name_en required' }, 400);

  // Validate slug format
  if (!/^[a-z0-9-]+$/.test(id)) return json({ error: 'id must be lowercase slug (a-z, 0-9, -)' }, 400);

  try {
    await db.prepare(`
      INSERT INTO genres (id, name_en, name_ar, name_ku, sort_order)
      VALUES (?, ?, ?, ?, ?)
    `).bind(id, name_en, name_ar ?? null, name_ku ?? null, sort_order).run();

    // Auto-create English alias matching the id
    await db.prepare(`INSERT OR IGNORE INTO genre_aliases (alias, genre_id, locale) VALUES (?, ?, 'en')`).bind(id, id).run();
    if (name_en.toLowerCase() !== id) {
      await db.prepare(`INSERT OR IGNORE INTO genre_aliases (alias, genre_id, locale) VALUES (?, ?, 'en')`).bind(name_en.toLowerCase(), id).run();
    }

    return json({ ok: true, id });
  } catch (e: unknown) {
    const msg = e instanceof Error ? e.message : String(e);
    return json({ error: msg }, 409);
  }
}
