import { NextResponse } from "next/server";
import { query } from "@/lib/db/postgres";
import { buildScopedSummary, buildSummary, isValidMonth, monthRange, todayIso, type SummaryRow } from "@/lib/finance/api-validation";
import { RECURRING_COLUMNS, badRequest, financeAuth, serverError, unauthorized } from "@/lib/finance/api-server";

// GET /api/v1/finances/summary?month=YYYY-MM (Standard: aktueller Monat)
// Einnahmen/Ausgaben je Kategorie, Budgets vs. Ist, offene (pending) Buchungen, fällige Abos der nächsten 30 Tage.
export async function GET(req: Request) {
  const userId = await financeAuth(req, "read");
  if (!userId) return unauthorized();

  const today = todayIso();
  const month = new URL(req.url).searchParams.get("month") || today.slice(0, 7);
  if (!isValidMonth(month)) return badRequest("month must be YYYY-MM");
  const range = monthRange(month);

  try {
    const [totals, budgets, pending, upcoming] = await Promise.all([
      query<SummaryRow>(
        `SELECT type, category, currency, business, SUM(amount_cents) AS total_cents, COUNT(*) AS count
         FROM finance_transactions
         WHERE user_id = $1 AND transaction_date >= $2 AND transaction_date < $3
         GROUP BY type, category, currency, business`,
        [userId, range.from, range.to]
      ),
      query(
        `SELECT b.category, b.amount_cents AS budget_cents, b.currency,
                COALESCE((SELECT SUM(t.amount_cents) FROM finance_transactions t
                          WHERE t.user_id = b.user_id AND t.type = 'expense' AND t.category = b.category
                            AND t.currency = b.currency AND t.transaction_date >= $2 AND t.transaction_date < $3), 0) AS spent_cents
         FROM finance_budgets b WHERE b.user_id = $1 AND b.month = $2 ORDER BY b.category`,
        [userId, range.from, range.to]
      ),
      query(
        `SELECT COUNT(*) AS count FROM finance_transactions WHERE user_id = $1 AND status = 'pending'`,
        [userId]
      ),
      query(
        `SELECT ${RECURRING_COLUMNS} FROM finance_recurring_items
         WHERE user_id = $1 AND is_active AND next_due_date <= ($2::date + 30) ORDER BY next_due_date`,
        [userId, today]
      ),
    ]);

    return NextResponse.json({
      month,
      totals: buildSummary(totals.rows),
      // privat vs. geschäftlich, jeweils pro Währung
      by_scope: buildScopedSummary(totals.rows),
      budgets: budgets.rows.map((b) => ({ ...b, spent_cents: Number(b.spent_cents), over_budget: Number(b.spent_cents) > Number(b.budget_cents) })),
      pending_count: Number(pending.rows[0]?.count ?? 0),
      upcoming_recurring: upcoming.rows,
    });
  } catch (error) {
    return serverError("Finance summary GET error", error);
  }
}
