import { NextResponse } from "next/server";
import { z } from "zod";
import { applicationProviders } from "@/lib/application-providers";
import { applicationBody, applicationRoute } from "@/lib/application-http";
import { ApplicationError } from "@/lib/application-record";
import {
  createStaffSession,
  endStaffSession,
  staffCookie,
  staffCookieName,
  STAFF_SESSION_SECONDS,
} from "@/lib/staff-auth";
export async function POST(request: Request) {
  return applicationRoute(async () => {
    const providers = applicationProviders();
    const parsed = z
      .object({ idToken: z.string().min(1).max(8192) })
      .strict()
      .safeParse(await applicationBody(request, providers.origin));
    if (!parsed.success)
      throw new ApplicationError(400, "Staff sign-in failed.");
    await providers.limit(request);
    const cookie = await createStaffSession(parsed.data.idToken, providers);
    const response = NextResponse.json(
      { ok: true },
      { headers: { "Cache-Control": "no-store, private" } },
    );
    response.cookies.set(staffCookieName(providers.mock), cookie, {
      httpOnly: true,
      secure: !providers.mock,
      sameSite: "strict",
      path: "/",
      maxAge: STAFF_SESSION_SECONDS,
    });
    return response;
  });
}
export async function DELETE(request: Request) {
  return applicationRoute(async () => {
    const providers = applicationProviders();
    await applicationBody(request, providers.origin);
    try {
      await endStaffSession(staffCookie(request, providers.mock), providers);
    } catch (error) {
      if (!(
        error instanceof ApplicationError &&
        (error.status === 401 || error.status === 403)
      ))
        throw error;
    }
    const response = NextResponse.json(
      { ok: true },
      { headers: { "Cache-Control": "no-store, private" } },
    );
    response.cookies.set(staffCookieName(providers.mock), "", {
      httpOnly: true,
      secure: !providers.mock,
      sameSite: "strict",
      path: "/",
      maxAge: 0,
    });
    return response;
  });
}
