export const prerender = false;

import type { APIRoute } from 'astro';
import { isAuthenticated, ADMIN_COOKIE } from '@admin/lib/admin-auth';
import { sanitizePipelinePayload, toInternalPipelineId } from '@/lib/pipeline-public';

export const POST: APIRoute = async ({ request, cookies, locals }) => {
  const runtime = (locals as any).runtime as {
    env: { DB: D1Database; SCRAPER_WORKER_URL?: string; SCRAPER_ADMIN_TOKEN?: string }
  } | undefined;
  const db = runtime?.env?.DB;
  if (!db || !await isAuthenticated(cookies.get(ADMIN_COOKIE)?.value, db)) {
    return new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401, headers: { 'Content-Type': 'application/json' } });
  }

  const scraperUrl = runtime?.env?.SCRAPER_WORKER_URL;
  const scraperToken = runtime?.env?.SCRAPER_ADMIN_TOKEN;
  if (!scraperUrl || !scraperToken) {
    return new Response(
      JSON.stringify({ error: 'SCRAPER_WORKER_URL or SCRAPER_ADMIN_TOKEN not configured' }),
      { status: 503, headers: { 'Content-Type': 'application/json' } }
    );
  }

  const url = new URL(request.url);
  const target = url.searchParams.get('target') ?? url.searchParams.get('chain');
  const kind = url.searchParams.get('kind');
  const sync = url.searchParams.get('sync');
  if (!target) {
    return new Response(JSON.stringify({ error: 'target param required' }), { status: 400, headers: { 'Content-Type': 'application/json' } });
  }
  if (kind && kind !== 'source' && kind !== 'pipeline') {
    return new Response(JSON.stringify({ error: 'kind must be source or pipeline' }), { status: 400, headers: { 'Content-Type': 'application/json' } });
  }

  try {
    const internalTarget = kind === 'pipeline' ? toInternalPipelineId(target) : target;
    const qs = new URLSearchParams({ target: internalTarget });
    if (kind) qs.set('kind', kind);
    if (sync === '1') qs.set('sync', '1');
    const res = await fetch(`${scraperUrl}/run?${qs.toString()}`, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${scraperToken}`,
      },
    });
    const text = await res.text();
    let data: unknown;
    try { data = JSON.parse(text); } catch { data = { raw: text }; }
    return new Response(JSON.stringify(sanitizePipelinePayload(data)), {
      status: res.ok ? 200 : 502,
      headers: { 'Content-Type': 'application/json' },
    });
  } catch (e) {
    return new Response(JSON.stringify({ error: String(e) }), { status: 502, headers: { 'Content-Type': 'application/json' } });
  }
};
