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

function getAuthHeader(token: string): string {
  return token.includes(':')
    ? `Basic ${Buffer.from(token).toString('base64')}`
    : `Bearer ${token}`;
}

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, 'bitbucket')),
  });

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

  const { searchParams } = new URL(request.url);
  const workspace = searchParams.get('workspace') ?? '';
  const q = searchParams.get('q') ?? '';
  const page = searchParams.get('page') ?? '1';

  if (!workspace) return NextResponse.json({ connected: true, repos: [] });

  const headers = { Authorization: getAuthHeader(account.accessToken) };

  let apiUrl = `https://api.bitbucket.org/2.0/repositories/${encodeURIComponent(workspace)}?pagelen=50&sort=-updated_on&page=${page}`;
  if (q) apiUrl += `&q=name~"${encodeURIComponent(q)}"`;

  const res = await fetch(apiUrl, { headers });
  if (!res.ok) {
    console.error('[Bitbucket Repos] API error:', res.status, res.statusText);
    const errorText = await res.text().catch(() => '');
    console.error('[Bitbucket Repos] Error response:', errorText);
    if (res.status === 403) {
      return NextResponse.json({
        connected: false,
        repos: [],
        error: 'Permission denied. Your token may not have repository read permissions for this workspace.'
      });
    }
    return NextResponse.json({ connected: false, repos: [], error: `API error: ${res.status}` });
  }

  const data = await res.json();
  const repos = (data.values ?? []).map((r: any) => ({
    slug: r.slug,
    name: r.name,
    workspace: workspace,
    description: r.description ?? null,
    isPrivate: r.is_private,
    language: r.language || null,
    mainBranch: r.mainbranch?.name || 'main',
    htmlUrl: r.links?.html?.href ?? `https://bitbucket.org/${workspace}/${r.slug}`,
    updatedOn: r.updated_on,
  }));

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