import { NextRequest, NextResponse } from 'next/server';

// Updated to use the new Purchase Order API (PO API) configuration
const SUPPLIER_API_BASE = (process.env.NEXT_PUBLIC_PO_API_URL 
  ?? process.env.SUPPLIER_CATALOG_BASE 
  ?? '').replace(/\/$/, '');

const SUPPLIER_API_KEY = process.env.NEXT_PUBLIC_PO_API_KEY 
  ?? process.env.SUPPLIER_CATALOG_KEY 
  ?? '';

const buildUpstreamUrl = (request: NextRequest): URL => {
  // Ensure we hit the correct backend endpoint: /suppliers
  // PO API Base is usually .../api. We want .../api/suppliers.
  // Note: If NEXT_PUBLIC_PO_API_URL ends in /api, we append /suppliers.
  const upstreamUrl = new URL(`${SUPPLIER_API_BASE}/suppliers`);
  
  request.nextUrl.searchParams.forEach((value, key) => {
    upstreamUrl.searchParams.set(key, value);
  });
  if (!upstreamUrl.searchParams.has('page_size')) {
    upstreamUrl.searchParams.set('page_size', '100');
  }
  return upstreamUrl;
};

const rewriteNextLink = (next: unknown): string | null => {
  if (typeof next !== 'string' || !next.trim()) {
    return null;
  }
  try {
    const parsed = next.startsWith('http') ? new URL(next) : new URL(next, `${SUPPLIER_API_BASE}/`);
    const query = parsed.searchParams.toString();
    return `/api/supplier-directory${query ? `?${query}` : ''}`;
  } catch (_) {
    return null;
  }
};

export async function GET(request: NextRequest) {
  if (!SUPPLIER_API_KEY) {
    return NextResponse.json({ error: 'Supplier API key is not configured.' }, { status: 500 });
  }

  const upstreamUrl = buildUpstreamUrl(request);

  try {
    const upstreamResponse = await fetch(upstreamUrl, {
      headers: {
        'Content-Type': 'application/json',
        'X-API-Key': SUPPLIER_API_KEY,
        // Critical for Ngrok bypass
        'ngrok-skip-browser-warning': 'true',
      },
      // Prevent Next.js from caching upstream errors indefinitely
      cache: 'no-store',
    });

    if (!upstreamResponse.ok) {
      const errorBody = await upstreamResponse.text();
      return NextResponse.json(
        { error: 'Supplier directory request failed.', details: errorBody || upstreamResponse.statusText },
        { status: upstreamResponse.status },
      );
    }

    const payload = await upstreamResponse.json();
    const rewrittenNext = rewriteNextLink(payload?.next ?? null);

    const proxiedBody = { ...payload, next: rewrittenNext };

    return NextResponse.json(proxiedBody, {
      status: 200,
      headers: {
        'Cache-Control': 'private, max-age=300',
      },
    });
  } catch (error) {
    return NextResponse.json(
      { error: 'Unable to reach supplier directory upstream.', details: error instanceof Error ? error.message : 'Unknown error' },
      { status: 502 },
    );
  }
}
