/**
 * GET  /api/geoportal/setup-views — check if views exist
 * POST /api/geoportal/setup-views — create views (idempotent)
 */
import { NextResponse } from "next/server";
import { prisma } from "@/core/storage/prisma";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

const VIEWS = [
  {
    name: "gis_uats_z0",
    sql: `CREATE OR REPLACE VIEW gis_uats_z0 AS SELECT siruta, name, ST_SimplifyPreserveTopology(geom, 2000) AS geom FROM "GisUat" WHERE geom IS NOT NULL`,
  },
  {
    name: "gis_uats_z5",
    sql: `CREATE OR REPLACE VIEW gis_uats_z5 AS SELECT siruta, name, ST_SimplifyPreserveTopology(geom, 500) AS geom FROM "GisUat" WHERE geom IS NOT NULL`,
  },
  {
    name: "gis_uats_z8",
    sql: `CREATE OR REPLACE VIEW gis_uats_z8 AS SELECT siruta, name, county, ST_SimplifyPreserveTopology(geom, 50) AS geom FROM "GisUat" WHERE geom IS NOT NULL`,
  },
  {
    name: "gis_uats_z12",
    sql: `CREATE OR REPLACE VIEW gis_uats_z12 AS SELECT siruta, name, county, geom FROM "GisUat" WHERE geom IS NOT NULL`,
  },
];

/** GET — returns { ready: boolean, missing: string[] } */
export async function GET() {
  try {
    const existing = await prisma.$queryRaw`
      SELECT viewname FROM pg_views
      WHERE schemaname = 'public' AND viewname LIKE 'gis_uats_z%'
    ` as Array<{ viewname: string }>;

    const existingNames = new Set(existing.map((r) => r.viewname));
    const missing = VIEWS.filter((v) => !existingNames.has(v.name)).map((v) => v.name);

    return NextResponse.json({ ready: missing.length === 0, missing });
  } catch (error) {
    const msg = error instanceof Error ? error.message : "Eroare";
    return NextResponse.json({ ready: false, missing: VIEWS.map((v) => v.name), error: msg });
  }
}

/** POST — creates all views (idempotent) */
export async function POST() {
  const results: string[] = [];
  try {
    for (const v of VIEWS) {
      await prisma.$executeRawUnsafe(v.sql);
      results.push(`${v.name} OK`);
    }
    return NextResponse.json({ status: "ok", results });
  } catch (error) {
    const msg = error instanceof Error ? error.message : "Eroare";
    return NextResponse.json({ status: "error", results, error: msg }, { status: 500 });
  }
}
