import { NextResponse } from 'next/server';

const BASE_URL = process.env.INSIGHTS_BASE_URL || 'https://fa1501a1bf07.ngrok-free.app/monrita-main/backend/public/api/v1';
const API_KEY = process.env.INSIGHTS_API_KEY || process.env.NEXT_PUBLIC_INSIGHTS_API_KEY;

function buildQuery(params: Record<string, string | number | undefined | null>) {
  const search = new URLSearchParams();
  Object.entries(params).forEach(([key, value]) => {
    if (value !== undefined && value !== null && value !== '') {
      search.append(key, String(value));
    }
  });
  return search.toString();
}

export async function POST(request: Request) {
  if (!API_KEY) {
    return NextResponse.json({ error: 'Server missing INSIGHTS_API_KEY' }, { status: 500 });
  }

  let body: any = {};
  try {
    body = await request.json();
  } catch (_) {
    return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 });
  }

  const {
    supplier_id,
    supplier_name,
    business_name,
    commodity_id,
    commodity_code,
    commodity_name,
    school_id,
    school_code,
    school_name,
    plan_period_id,
    date_from,
    date_to,
  } = body || {};

  if (!supplier_id && !supplier_name && !business_name) {
    return NextResponse.json({ error: 'Provide supplier_id or supplier_name/business_name' }, { status: 422 });
  }
  if (!commodity_id && !commodity_code && !commodity_name) {
    return NextResponse.json({ error: 'Provide commodity_id or commodity_code/name' }, { status: 422 });
  }
  if (!school_id && !school_code && !school_name) {
    return NextResponse.json({ error: 'Provide school_id or school_code/name' }, { status: 422 });
  }

  const query = buildQuery({
    supplier_id,
    supplier_name,
    business_name,
    commodity_id,
    commodity_code,
    commodity_name,
    school_id,
    school_code,
    school_name,
    plan_period_id,
    date_from,
    date_to,
  });

  const url = `${BASE_URL}/insights/supplier-ledger?${query}`;

  try {
    const upstream = await fetch(url, {
      headers: {
        'X-API-Key': API_KEY,
        Accept: 'application/json',
      },
      cache: 'no-store',
    });

    const data = await upstream.json().catch(() => ({}));
    return NextResponse.json(data, { status: upstream.status });
  } catch (error: any) {
    return NextResponse.json({ error: 'Upstream request failed', detail: String(error?.message || error) }, { status: 502 });
  }
}
