import { NextResponse } from "next/server";
import { query } from "@/lib/db/postgres";
import { parseCategoryCreate } from "@/lib/finance/api-validation";
import { badRequest, financeAuth, readJson, serverError, unauthorized } from "@/lib/finance/api-server";

const COLUMNS = "id, name, type, color, sort_order, created_at, updated_at";

export async function GET(req: Request) {
  const userId = await financeAuth(req, "read");
  if (!userId) return unauthorized();
  try {
    const { rows } = await query(
      `SELECT ${COLUMNS} FROM finance_categories WHERE user_id = $1 ORDER BY sort_order, name`,
      [userId]
    );
    return NextResponse.json({ categories: rows });
  } catch (error) {
    return serverError("Finance categories GET error", error);
  }
}

// POST: Kategorie anlegen – existiert der Name schon, wird die vorhandene zurückgegeben (200).
export async function POST(req: Request) {
  const userId = await financeAuth(req, "write");
  if (!userId) return unauthorized();

  const parsed = parseCategoryCreate(await readJson(req));
  if (!parsed.ok) return badRequest(parsed.error);
  const c = parsed.value;

  try {
    const { rows } = await query(
      `INSERT INTO finance_categories (user_id, name, type, color, sort_order)
       VALUES ($1, $2, $3, $4, COALESCE((SELECT MAX(sort_order) + 1 FROM finance_categories WHERE user_id = $1), 0))
       ON CONFLICT (user_id, name) DO NOTHING
       RETURNING ${COLUMNS}`,
      [userId, c.name, c.type, c.color]
    );
    if (rows[0]) return NextResponse.json({ category: rows[0], created: true }, { status: 201 });
    const existing = await query(`SELECT ${COLUMNS} FROM finance_categories WHERE user_id = $1 AND name = $2`, [userId, c.name]);
    return NextResponse.json({ category: existing.rows[0] ?? null, created: false }, { status: 200 });
  } catch (error) {
    return serverError("Finance categories POST error", error);
  }
}
