import { z } from "zod";
import { applicationProviders } from "@/lib/application-providers";
import {
  applicationBody,
  applicationReply,
  applicationRoute,
} from "@/lib/application-http";
import { requireStaff, staffCookie } from "@/lib/staff-auth";
import { ApplicationError } from "@/lib/application-record";
import { staffView } from "@/lib/staff-model";
import { applyStaffChange } from "@/lib/staff-service";
type Context = { params: Promise<{ id: string }> };
export async function GET(request: Request, context: Context) {
  return applicationRoute(async () => {
    const providers = applicationProviders();
    await requireStaff(staffCookie(request, providers.mock), providers);
    const id = z.uuid().safeParse((await context.params).id);
    if (!id.success) throw new ApplicationError(404, "Application not found.");
    const record = await providers.repo.get(id.data);
    if (!record || record.deleting)
      throw new ApplicationError(404, "Application unavailable.");
    return applicationReply(staffView(record));
  });
}
export async function PATCH(request: Request, context: Context) {
  return applicationRoute(async () => {
    const providers = applicationProviders(),
      staff = await requireStaff(
        staffCookie(request, providers.mock),
        providers,
      );
    const id = z.uuid().safeParse((await context.params).id);
    if (!id.success) throw new ApplicationError(404, "Application not found.");
    return applicationReply(
      await applyStaffChange(
        id.data,
        await applicationBody(request, providers.origin),
        {
          actor: staff.uid,
          author: staff.email.toLowerCase(),
          team: providers.config.STAFF_EMAIL_ALLOWLIST,
        },
        providers.repo,
      ),
    );
  });
}
