'use server';

import { revalidatePath } from 'next/cache';
import { z } from 'zod';
import { getDb } from '@pintrush/db';
import { actionError, actionOk, CONFLICT_MESSAGE, type ActionResult } from '@/components/host/action-result';
import { requireAdmin } from '@/lib/auth/session';
import { adminAudit } from '../../_lib/audit';

const Schema = z.object({
  packId: z.uuid(),
  status: z.enum(['PUBLISHED', 'ARCHIVED']),
  expectedVersion: z.coerce.number().int().min(0),
});

/** Publish or archive a question pack. Archived packs can't be picked for new plans or always-on. */
export async function setPackStatus(_prev: ActionResult, formData: FormData): Promise<ActionResult> {
  const { admin } = await requireAdmin();
  const parsed = Schema.safeParse({ packId: formData.get('packId'), status: formData.get('status'), expectedVersion: formData.get('expectedVersion') });
  if (!parsed.success) return actionError('Reload the page and try again.');
  const { packId, status, expectedVersion } = parsed.data;
  const db = getDb();
  const outcome = await db.$transaction(async (tx) => {
    const pack = await tx.questionPack.findUnique({ where: { id: packId }, select: { name: true, key: true, status: true, venueId: true } });
    if (!pack) return 'missing' as const;
    const { count } = await tx.questionPack.updateMany({ where: { id: packId, version: expectedVersion }, data: { status, version: { increment: 1 } } });
    if (count === 0) return 'conflict' as const;
    await adminAudit(tx, admin.id, 'admin.pack.status_changed', { packId, key: pack.key, from: pack.status, to: status }, { venueId: pack.venueId });
    return pack;
  });
  if (outcome === 'missing') return actionError('That pack no longer exists.');
  if (outcome === 'conflict') return actionError(CONFLICT_MESSAGE);
  revalidatePath('/admin/packs', 'layout');
  return actionOk(
    status === 'PUBLISHED'
      ? `“${outcome.name}” is published and can be picked by venues.`
      : `“${outcome.name}” is archived. Venues can’t pick it for new shows; plans that already use it need a different pack.`,
  );
}
