export const prerender = false;

import type { APIRoute } from 'astro';
import { env } from 'cloudflare:workers';
import { buildAuthEngine, type AuthEnv } from '../../../lib/auth-engine.js';
import { type DbEnv } from '../../../lib/db.js';
import { type SessionEnv } from '../../../lib/session.js';
import { type StorefrontLimiterEnv } from '../../../lib/rate-limit.js';
import { jsonError } from '../../../lib/http.js';

function isDuplicateRegistrationError(e: unknown): boolean {
  return (
    e instanceof Error &&
    (e.message.includes('UNIQUE') ||
      e.message.toLowerCase().includes('duplicate') ||
      (e as { code?: string }).code === '23505')
  );
}

const REGISTERED_REDIRECT = '/login?registered=1';

export const POST: APIRoute = async ({ request, redirect }) => {
  const cfEnv = env as (AuthEnv & SessionEnv & DbEnv & StorefrontLimiterEnv) | undefined;
  if (!cfEnv?.SESSION || (!cfEnv?.DB && !cfEnv?.DATABASE_URL)) {
    return jsonError(503, 'service_unavailable', 'Service not configured.');
  }

  const formData = await request.formData();
  const email = String(formData.get('email') ?? '');
  const password = String(formData.get('password') ?? '');

  try {
    await buildAuthEngine(cfEnv).createUser({ email, password, roles: ['user'] });
    return redirect(REGISTERED_REDIRECT, 302);
  } catch (e) {
    if (isDuplicateRegistrationError(e)) {
      return redirect(REGISTERED_REDIRECT, 302);
    }
    throw e;
  }
};
