import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs/promises';
import path from 'path';
import type { PreEscaleta, PreEscaletaSegmento, PreEscaletaPlano, ActoGuion } from '@/types/project';
import { parseTimeRange } from '@/lib/prompts';

const PROJECTS_DIR = path.join(process.cwd(), 'projects');

async function findCapDir(capitulosDir: string, numero: string) {
  const dirs = await fs.readdir(capitulosDir, { withFileTypes: true });
  return dirs.find(d =>
    d.isDirectory() && d.name.startsWith(numero.padStart(2, '0'))
  );
}

/** Build pre-escaleta from structured actos — pure computation, no LLM */
function buildPreEscaleta(actos: ActoGuion[], capituloTitulo: string): PreEscaleta {
  const segmentos: PreEscaletaSegmento[] = [];
  let planoCounter = 1;
  let totalSeconds = 0;

  for (const acto of actos) {
    for (let segIdx = 0; segIdx < acto.segmentos.length; segIdx++) {
      const seg = acto.segmentos[segIdx];
      const duracion = parseTimeRange(seg.tiempo);
      const numPlanos = Math.max(2, Math.round(duracion / 5));
      totalSeconds += duracion;

      const planos: PreEscaletaPlano[] = [];
      for (let i = 0; i < numPlanos; i++) {
        planos.push({
          id: `plano-${String(planoCounter).padStart(3, '0')}`,
          numeroPlano: `${acto.numero}.${segIdx + 1}.${i + 1}`,
          nombre: `Plano ${acto.numero}.${segIdx + 1}.${i + 1}`,
          segmentoId: seg.id,
          tiempoSegundos: 5,
        });
        planoCounter++;
      }

      segmentos.push({
        segmentoId: seg.id,
        nombre: seg.nombre,
        actoNumero: acto.numero,
        segmentoIndex: segIdx,
        tiempo: seg.tiempo,
        duracionSegundos: duracion,
        totalPlanos: numPlanos,
        planos,
      });
    }
  }

  return {
    capitulo: capituloTitulo,
    duracionTotalSegundos: totalSeconds,
    totalPlanos: planoCounter - 1,
    segmentos,
  };
}

export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ slug: string; numero: string }> }
) {
  try {
    const { slug, numero } = await params;
    const capitulosDir = path.join(PROJECTS_DIR, slug, 'capitulos');
    const capDir = await findCapDir(capitulosDir, numero);

    if (!capDir) {
      return NextResponse.json(null);
    }

    const preEscaletaPath = path.join(capitulosDir, capDir.name, 'pre-escaleta.json');

    try {
      const content = await fs.readFile(preEscaletaPath, 'utf-8');
      return NextResponse.json(JSON.parse(content));
    } catch {
      return NextResponse.json(null);
    }
  } catch (error: any) {
    console.error('Error fetching pre-escaleta:', error);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

export async function POST(
  request: NextRequest,
  { params }: { params: Promise<{ slug: string; numero: string }> }
) {
  try {
    const { slug, numero } = await params;
    const { action, guion } = await request.json();

    const capitulosDir = path.join(PROJECTS_DIR, slug, 'capitulos');
    const capDir = await findCapDir(capitulosDir, numero);

    if (!capDir) {
      return NextResponse.json({ error: 'Capítulo no encontrado' }, { status: 404 });
    }

    const capPath = path.join(capitulosDir, capDir.name);
    const preEscaletaPath = path.join(capPath, 'pre-escaleta.json');

    if (action === 'generate') {
      if (!guion?.actos || guion.actos.length === 0) {
        return NextResponse.json(
          { error: 'El guión conductor no tiene actos estructurados. Regenera el guión primero.' },
          { status: 400 }
        );
      }

      const preEscaleta = buildPreEscaleta(guion.actos, guion.titulo || '');
      await fs.writeFile(preEscaletaPath, JSON.stringify(preEscaleta, null, 2));
      return NextResponse.json(preEscaleta);
    }

    if (action === 'save') {
      const { preEscaleta } = await request.json().catch(() => ({ preEscaleta: null }));
      if (preEscaleta) {
        await fs.writeFile(preEscaletaPath, JSON.stringify(preEscaleta, null, 2));
        return NextResponse.json({ success: true });
      }
    }

    return NextResponse.json({ error: 'Acción inválida' }, { status: 400 });
  } catch (error: any) {
    console.error('Error en pre-escaleta:', error);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}
