import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/db/client';
import { getAuthenticatedStore, extractShopDomainFromRequest } from '@/lib/auth/storeContext';
import { SHOPIFY_CONFIG } from '@/config/shopify';
import { decrypt } from '@/lib/crypto/encryption';
import { env } from '@/lib/config/env';

export const dynamic = 'force-dynamic';

export async function GET(req: NextRequest) {
  try {
    let shop = await getAuthenticatedStore(req);
    const shopDomain = req.nextUrl.searchParams.get('shop') || req.nextUrl.searchParams.get('shopify_domain');
    if (!shop && shopDomain) {
      shop = await db.getShopByDomain(shopDomain);
    }
    if (!shop) {
      const requestedDomain =
        extractShopDomainFromRequest(req) ||
        shopDomain ||
        SHOPIFY_CONFIG.defaultShopDomain;

      return NextResponse.json({
        success: true,
        connected: false,
        status: 'disconnected',
        onboardingCompleted: false,
        shop: {
          id: `shop_${requestedDomain.replace(/[^a-zA-Z0-9]/g, '_')}`,
          domain: requestedDomain,
        },
        user: null,
        meta: null,
      });
    }

    const metaConn = await db.getMetaConnectionByShopId(shop.id);

    // Derived ONLY from a real Facebook OAuth connection stored in DB
    if (!metaConn || metaConn.status !== 'connected' || !metaConn.access_token_encrypted) {
      return NextResponse.json({
        success: true,
        connected: false,
        status: metaConn?.status === 'token_expired' ? 'token_expired' : 'disconnected',
        onboardingCompleted: false,
        shop: {
          id: shop.id,
          domain: shop.shopify_domain,
        },
        user: null,
        meta: null,
      });
    }

    // Decrypt access token
    let accessToken = '';
    try {
      accessToken = decrypt(metaConn.access_token_encrypted);
    } catch {
      accessToken = '';
    }

    if (!accessToken) {
      metaConn.status = 'disconnected';
      await db.upsertMetaConnection(metaConn);
      return NextResponse.json({
        success: true,
        connected: false,
        status: 'disconnected',
        onboardingCompleted: false,
        shop: {
          id: shop.id,
          domain: shop.shopify_domain,
        },
        user: null,
        meta: null,
      });
    }

    // Check expiration date if available
    if (metaConn.token_expires_at) {
      const expiresAt = new Date(metaConn.token_expires_at).getTime();
      if (!isNaN(expiresAt) && expiresAt <= Date.now()) {
        metaConn.status = 'token_expired';
        await db.upsertMetaConnection(metaConn);
        return NextResponse.json({
          success: true,
          connected: false,
          status: 'token_expired',
          error: 'Facebook access token has expired. Please reconnect.',
          shop: {
            id: shop.id,
            domain: shop.shopify_domain,
          },
          user: {
            id: metaConn.fb_user_id || '',
            name: metaConn.fb_user_name || 'Facebook Account',
          },
          meta: null,
        });
      }
    }

    // Validate with Facebook Graph API (/me)
    let fbUser = {
      id: metaConn.fb_user_id || metaConn.business_id || '',
      name: metaConn.fb_user_name || metaConn.business_name || 'Connected Facebook Account',
      avatar: metaConn.fb_user_id ? `https://graph.facebook.com/${metaConn.fb_user_id}/picture?type=large` : null,
    };

    try {
      const graphVersion = env.meta.graphVersion || 'v20.0';
      const checkRes = await fetch(
        `https://graph.facebook.com/${graphVersion}/me?fields=id,name,picture&access_token=${encodeURIComponent(accessToken)}`,
        { signal: AbortSignal.timeout(4000), cache: 'no-store' }
      );
      const checkData = await checkRes.json();

      if (checkRes.ok && checkData.id) {
        fbUser = {
          id: checkData.id,
          name: checkData.name,
          avatar: checkData.picture?.data?.url || (checkData.id ? `https://graph.facebook.com/${checkData.id}/picture?type=large` : null),
        };

        // Update stored name / user id if needed
        if (metaConn.fb_user_id !== checkData.id || metaConn.fb_user_name !== checkData.name) {
          metaConn.fb_user_id = checkData.id;
          metaConn.fb_user_name = checkData.name;
          await db.upsertMetaConnection(metaConn);
        }
      } else if (checkData.error) {
        // Token revoked / invalid
        if (checkData.error.code === 190 || checkData.error.error_subcode === 463) {
          metaConn.status = 'token_expired';
          await db.upsertMetaConnection(metaConn);
          return NextResponse.json({
            success: true,
            connected: false,
            status: 'token_expired',
            error: checkData.error.message || 'Facebook access token is invalid or expired',
            shop: {
              id: shop.id,
              domain: shop.shopify_domain,
            },
            user: fbUser,
            meta: null,
          });
        }
      }
    } catch {
      // Network timeout or temporary Graph API glitch: allow existing connection if not explicitly expired
    }

    return NextResponse.json({
      success: true,
      connected: true,
      status: 'connected',
      onboardingCompleted: Boolean(metaConn.onboarding_completed || true),
      shop: {
        id: shop.id,
        domain: shop.shopify_domain,
      },
      user: fbUser,
      meta: {
        id: metaConn.id,
        businessId: metaConn.business_id,
        businessName: metaConn.business_name,
        catalogId: metaConn.catalog_id,
        catalogName: metaConn.catalog_name,
        pixelId: metaConn.pixel_id,
        pixelName: metaConn.pixel_name,
        status: 'connected',
        onboardingCompleted: Boolean(metaConn.onboarding_completed || true),
      },
    });
  } catch (err: any) {
    return NextResponse.json(
      { success: false, error: err?.message || 'Failed to fetch meta connection status' },
      { status: 500 }
    );
  }
}
