import { NextRequest, NextResponse } from 'next/server';
import { buildMetaAuthUrl } from '@/lib/meta/oauth';
import { db } from '@/db/client';
import { getAuthenticatedStore, unauthorizedResponse } from '@/lib/auth/storeContext';
import { buildAppUrl } from '@/config/app';

export const dynamic = 'force-dynamic';

export async function GET(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const shopDomain = searchParams.get('shop');

    let shop = await getAuthenticatedStore(req);
    if (!shop && shopDomain) {
      shop = await db.getShopByDomain(shopDomain);
      if (!shop) {
        const now = new Date().toISOString();
        const shopId = `shop_${shopDomain.replace(/[^a-zA-Z0-9]/g, '_')}`;
        shop = await db.upsertShop({
          id: shopId,
          shopify_domain: shopDomain,
          access_token_encrypted: '',
          scopes: [],
          installed_at: now,
          created_at: now,
          updated_at: now,
          status: 'installed',
          plan: 'growth',
        });
      }
    }
    if (!shop && process.env.NODE_ENV !== 'production') {
      shop = await db.getDefaultShop();
    }
    if (!shop) {
      return unauthorizedResponse(req);
    }

    const redirectUri = buildAppUrl('/api/auth/meta/callback');

    const { url } = buildMetaAuthUrl(shop.id, redirectUri);
    if (searchParams.get('format') === 'json') {
      return NextResponse.json({ success: true, url });
    }
    return NextResponse.redirect(url);
  } catch (err) {
    return NextResponse.json(
      { error: err instanceof Error ? err.message : 'Meta OAuth Initialization Failed' },
      { status: 500 }
    );
  }
}
