import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";

type SavedRows = Record<string, unknown>;

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const projectIds = (searchParams.get("projectIds") ?? "")
    .split(",")
    .map((projectId) => projectId.trim())
    .filter(Boolean);

  if (projectIds.length === 0) {
    return NextResponse.json({ rowsByProject: {} });
  }

  try {
    await ensureProjectTaskRowTable();

    const rows = await prisma.$queryRawUnsafe<Array<{ project_id: string; rows: SavedRows }>>(
      `select project_id, rows from "ProjectTaskRows" where project_id = any($1::text[])`,
      projectIds
    );

    return NextResponse.json({
      rowsByProject: Object.fromEntries(rows.map((row) => [row.project_id, row.rows]))
    });
  } catch (error) {
    console.error("Unable to read project task rows", error);
    return NextResponse.json({ rowsByProject: {}, databaseAvailable: false }, { status: 503 });
  }
}

export async function POST(request: Request) {
  const body = await request.json().catch(() => null);

  if (!body || typeof body.projectId !== "string" || !Array.isArray(body.rows)) {
    return NextResponse.json({ error: "Invalid payload" }, { status: 400 });
  }

  try {
    await ensureProjectTaskRowTable();

    await prisma.$executeRawUnsafe(
      `
      insert into "ProjectTaskRows" (project_id, rows, updated_at)
      values ($1, $2::jsonb, now())
      on conflict (project_id)
      do update set rows = excluded.rows, updated_at = now()
      `,
      body.projectId,
      JSON.stringify(body.rows)
    );

    return NextResponse.json({ ok: true });
  } catch (error) {
    console.error("Unable to save project task rows", error);
    return NextResponse.json({ ok: false, databaseAvailable: false }, { status: 503 });
  }
}

async function ensureProjectTaskRowTable() {
  await prisma.$executeRawUnsafe(`
    create table if not exists "ProjectTaskRows" (
      project_id text primary key,
      rows jsonb not null,
      updated_at timestamp with time zone not null default now()
    )
  `);
}
