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

async function requireAdmin(request: NextRequest) {
  const accessToken = request.cookies.get('scriba.access_token')?.value;
  const session = await getSession(accessToken);
  if (!session) return null;
  const user = await db.query.users.findFirst({ where: eq(schema.users.id, session.user.id) });
  if (!user || user.role !== 'admin') return null;
  return session;
}

// GET /api/admin/conversions — list conversions with owner info (admin only)
export async function GET(request: NextRequest) {
  try {
    const session = await requireAdmin(request);
    if (!session) return NextResponse.json({ error: 'Forbidden' }, { status: 403 });

    const projects = await db.query.projects.findMany({
      orderBy: [desc(schema.projects.createdAt)],
    });

    const userIds = [...new Set(projects.map(p => p.userId).filter((id): id is string => !!id))];
    const ownerRows = userIds.length > 0
      ? await db.select({ id: schema.users.id, email: schema.users.email, name: schema.users.name })
          .from(schema.users)
          .where(inArray(schema.users.id, userIds))
      : [];
    const userMap = new Map(ownerRows.map(u => [u.id, u]));

    const enriched = projects.map(p => ({
      id: p.id,
      name: p.name,
      status: p.status,
      sourceLanguage: p.sourceLanguage,
      targetLanguage: p.targetLanguage,
      totalFiles: p.totalFiles,
      totalLines: p.totalLines,
      createdAt: p.createdAt,
      userId: p.userId,
      user: p.userId ? (userMap.get(p.userId) ?? null) : null,
    }));

    return NextResponse.json({ conversions: enriched, projects: enriched });
  } catch (error) {
    console.error('Admin list conversions error:', error);
    return NextResponse.json({ error: 'Failed to fetch conversions' }, { status: 500 });
  }
}

// DELETE /api/admin/conversions — delete ALL conversions system-wide (admin only)
export async function DELETE(request: NextRequest) {
  try {
    const session = await requireAdmin(request);
    if (!session) return NextResponse.json({ error: 'Forbidden' }, { status: 403 });

    await db.delete(schema.projects);

    return NextResponse.json({ success: true, message: 'All conversions deleted.' });
  } catch (error) {
    console.error('Admin delete all conversions error:', error);
    return NextResponse.json({ error: 'Failed to delete all conversions' }, { status: 500 });
  }
}
