import { NextRequest, NextResponse } from 'next/server';
import { getSession } from '@/lib/auth';
import { db, schema } from '@/lib/db';
import { eq, and } from 'drizzle-orm';

export async function GET(request: NextRequest) {
  const session = await getSession(request.cookies.get('scriba.access_token')?.value);
  if (!session) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });

  const account = await db.query.accounts.findFirst({
    where: and(eq(schema.accounts.userId, session.user.id), eq(schema.accounts.providerId, 'azure')),
  });

  if (!account?.accessToken) return NextResponse.json({ connected: false, repos: [] });

  const { searchParams } = new URL(request.url);
  const org = searchParams.get('org') ?? '';
  const q = searchParams.get('q') ?? '';
  if (!org) return NextResponse.json({ connected: true, repos: [] });

  const basicAuth = Buffer.from(`:${account.accessToken}`).toString('base64');
  const headers = { Authorization: `Basic ${basicAuth}` };

  // Fetch all projects in the org
  const projectsRes = await fetch(
    `https://dev.azure.com/${encodeURIComponent(org)}/_apis/projects?api-version=7.0&$top=100`,
    { headers }
  );
  if (!projectsRes.ok) return NextResponse.json({ connected: false, repos: [] });

  const projectsData = await projectsRes.json();
  const projects: any[] = projectsData.value ?? [];

  // Fetch repos for each project in parallel
  const repoFetches = projects.map(async (p: any) => {
    const reposRes = await fetch(
      `https://dev.azure.com/${encodeURIComponent(org)}/${encodeURIComponent(p.name)}/_apis/git/repositories?api-version=7.0`,
      { headers }
    );
    if (!reposRes.ok) return [];
    const reposData = await reposRes.json();
    return (reposData.value ?? []).map((r: any) => ({
      id: r.id,
      name: r.name,
      project: p.name,
      org,
      defaultBranch: r.defaultBranch?.replace('refs/heads/', '') || 'main',
      remoteUrl: r.remoteUrl,
      webUrl: r.webUrl ?? r.remoteUrl,
    }));
  });

  const allRepos = (await Promise.all(repoFetches)).flat();

  const repos = q
    ? allRepos.filter(r => r.name.toLowerCase().includes(q.toLowerCase()) || r.project.toLowerCase().includes(q.toLowerCase()))
    : allRepos;

  return NextResponse.json({ connected: true, repos });
}
