import { NextRequest, NextResponse } from 'next/server';

import { adminApiDisabledResponse, isAdminApiEnabled } from '@/lib/runtime/adminApi';

interface RouteParams {
  params: Promise<{
    funnelId: string;
  }>;
}

// GET /api/funnels/by-funnel-id/[funnelId] - получить воронку по funnelData.meta.id
// Этот endpoint обеспечивает совместимость с существующим кодом, который ожидает
// загрузку воронки по funnel ID из JSON файлов
export async function GET(request: NextRequest, { params }: RouteParams) {
  if (!isAdminApiEnabled()) {
    return adminApiDisabledResponse();
  }

  try {
    const { funnelId } = await params;
    const [{ default: connectMongoDB }, { default: FunnelModel }] = await Promise.all([
      import('@/lib/mongodb'),
      import('@/lib/models/Funnel'),
    ]);

    await connectMongoDB();

    const funnel = await FunnelModel.findOne({ 
      'funnelData.meta.id': funnelId,
      status: { $in: ['draft', 'published'] } // Исключаем архивированные
    });
    
    if (!funnel) {
      // Если воронка не найдена в БД, возвращаем 404
      return NextResponse.json(
        { error: `Funnel with ID "${funnelId}" not found` },
        { status: 404 }
      );
    }

    // Увеличиваем счетчик просмотров
    funnel.usage.totalViews += 1;
    funnel.usage.lastUsed = new Date();
    await funnel.save();

    // Возвращаем только данные воронки (для совместимости с FunnelRuntime)
    return NextResponse.json(funnel.funnelData);

  } catch (error) {
    console.error('GET /api/funnels/by-funnel-id/[funnelId] error:', error);
    return NextResponse.json(
      { error: 'Failed to fetch funnel' },
      { status: 500 }
    );
  }
}

// PUT /api/funnels/by-funnel-id/[funnelId] - обновить воронку по funnel ID
export async function PUT(request: NextRequest, { params }: RouteParams) {
  if (!isAdminApiEnabled()) {
    return adminApiDisabledResponse();
  }

  try {
    const { funnelId } = await params;
    const [{ default: connectMongoDB }, { default: FunnelModel }] = await Promise.all([
      import('@/lib/mongodb'),
      import('@/lib/models/Funnel'),
    ]);

    await connectMongoDB();

    const funnelData = await request.json();

    // Валидация
    if (!funnelData.meta || !funnelData.meta.id || !Array.isArray(funnelData.screens)) {
      return NextResponse.json(
        { error: 'Invalid funnel data structure' },
        { status: 400 }
      );
    }

    // Проверяем что ID в данных соответствует ID в URL
    if (funnelData.meta.id !== funnelId) {
      return NextResponse.json(
        { error: 'Funnel ID mismatch' },
        { status: 400 }
      );
    }

    const funnel = await FunnelModel.findOne({ 
      'funnelData.meta.id': funnelId 
    });
    
    if (!funnel) {
      return NextResponse.json(
        { error: `Funnel with ID "${funnelId}" not found` },
        { status: 404 }
      );
    }

    // Обновляем данные воронки
    funnel.funnelData = funnelData;
    funnel.version += 1;
    funnel.lastModifiedBy = 'api-update';

    // Обновляем мета-информацию если она изменилась
    if (funnelData.meta.title && funnelData.meta.title !== funnel.name) {
      funnel.name = funnelData.meta.title;
    }
    if (funnelData.meta.description) {
      funnel.description = funnelData.meta.description;
    }

    const savedFunnel = await funnel.save();

    return NextResponse.json(savedFunnel.funnelData);

  } catch (error) {
    console.error('PUT /api/funnels/by-funnel-id/[funnelId] error:', error);
    return NextResponse.json(
      { error: 'Failed to update funnel' },
      { status: 500 }
    );
  }
}
