import type { FieldError } from '@platform-modules/forms';

export const CONTACT_FLASH_COOKIE = 'mod_contact_flash';

export type ContactFlash = {
  errors: FieldError[];
  values: Record<string, string>;
};

export function parseContactFlash(cookieHeader: string | null): ContactFlash | null {
  if (!cookieHeader) return null;
  const match = cookieHeader.match(new RegExp(`(?:^|;\\s*)${CONTACT_FLASH_COOKIE}=([^;]+)`));
  if (!match?.[1]) return null;
  try {
    const raw = decodeURIComponent(match[1]);
    const parsed = JSON.parse(raw) as ContactFlash;
    if (!Array.isArray(parsed.errors) || typeof parsed.values !== 'object') return null;
    return parsed;
  } catch {
    return null;
  }
}

export function contactFlashClearHeader(): string {
  return `${CONTACT_FLASH_COOKIE}=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax`;
}

export function contactFlashSetHeader(flash: ContactFlash): string {
  const payload = encodeURIComponent(JSON.stringify(flash));
  return `${CONTACT_FLASH_COOKIE}=${payload}; Path=/; Max-Age=300; HttpOnly; SameSite=Lax`;
}

export function formDataToValues(formData: FormData, fieldNames: string[]): Record<string, string> {
  const values: Record<string, string> = {};
  for (const name of fieldNames) {
    const v = formData.get(name);
    if (typeof v === 'string') values[name] = v;
  }
  return values;
}

export function wantsJsonResponse(request: Request): boolean {
  const accept = request.headers.get('Accept') ?? '';
  return accept.includes('application/json');
}

export function contactRedirectWithFlash(
  errors: FieldError[],
  formData: FormData,
  fieldNames: string[],
): Response {
  const flash: ContactFlash = { errors, values: formDataToValues(formData, fieldNames) };
  return new Response(null, {
    status: 303,
    headers: {
      Location: '/contact',
      'Set-Cookie': contactFlashSetHeader(flash),
    },
  });
}
