import { NextRequest, NextResponse } from 'next/server';
import { dbHelpers } from '@/lib/db';
import { getSession } from '@/lib/auth';
import { applyMarker } from '@/lib/ai-marker';
import {
  buildMarkerMetadata,
  normalizeEngineOutputZipPath,
} from '@/lib/export-bundle';

type ConversionResultShape = {
  files?: Array<{ outputPath: string; content: string }>;
};

function readConversionResult(config: Record<string, unknown>): ConversionResultShape | undefined {
  const raw = config.conversionResult;
  if (raw && typeof raw === 'object') return raw as ConversionResultShape;
  return undefined;
}

export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  const { id } = await params;

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

  const project = await dbHelpers.getProject(id);
  if (!project) return NextResponse.json({ error: 'Project not found' }, { status: 404 });
  if (project.userId !== session.user.id) {
    return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
  }

  const config = (project.config ?? {}) as Record<string, unknown>;
  const conversionResult = readConversionResult(config);
  const engineFiles = conversionResult?.files ?? [];
  if (engineFiles.length === 0) {
    return NextResponse.json(
      { error: 'No converted files available. Complete the migration first.' },
      { status: 404 }
    );
  }

  const requestedPath = request.nextUrl.searchParams.get('path');
  const picked =
    (requestedPath
      ? engineFiles.find(
          (f) => normalizeEngineOutputZipPath(f.outputPath) === requestedPath
        )
      : undefined) ?? engineFiles[0];

  const normalizedPath = normalizeEngineOutputZipPath(picked.outputPath);
  const markerMeta = buildMarkerMetadata(project);
  const result = applyMarker(normalizedPath, picked.content ?? '', markerMeta);

  if (result.usedSidecar && result.sidecarPath && result.sidecarContent) {
    return new Response(result.sidecarContent, {
      status: 200,
      headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'Content-Disposition': `attachment; filename="${result.sidecarPath.split('/').pop()}"`,
      },
    });
  }

  return new Response(result.marked, {
    status: 200,
    headers: {
      'Content-Type': 'text/plain; charset=utf-8',
      'Content-Disposition': `attachment; filename="${normalizedPath.split('/').pop()}"`,
    },
  });
}
