import { NextRequest, NextResponse } from 'next/server';
import connectMongoDB from '@/lib/mongodb';
import { Image } from '@/lib/models/Image';
import { IS_FRONTEND_ONLY_BUILD } from '@/lib/runtime/buildVariant';
import crypto from 'crypto';

const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB (увеличено для видео)
const ALLOWED_TYPES = [
  // Изображения
  'image/jpeg', 
  'image/jpg', 
  'image/png', 
  'image/gif', 
  'image/webp', 
  'image/svg+xml',
  // Видео
  'video/mp4',
  'video/quicktime', // .mov файлы
  'video/webm'
];

export async function POST(request: NextRequest) {
  try {
    // Проверяем что это полная сборка (с БД)
    if (IS_FRONTEND_ONLY_BUILD) {
      return NextResponse.json(
        { error: 'Image upload not available in frontend-only mode' },
        { status: 403 }
      );
    }

    await connectMongoDB();

    const formData = await request.formData();
    const file = formData.get('file') as File;
    const funnelId = formData.get('funnelId') as string || undefined;
    const description = formData.get('description') as string || undefined;

    if (!file) {
      return NextResponse.json(
        { error: 'No file provided' },
        { status: 400 }
      );
    }

    // Валидация файла
    if (file.size > MAX_FILE_SIZE) {
      return NextResponse.json(
        { error: 'File too large. Maximum size is 10MB' },
        { status: 400 }
      );
    }

    if (!ALLOWED_TYPES.includes(file.type)) {
      return NextResponse.json(
        { error: 'Invalid file type. Allowed: images (JPG, PNG, WebP, GIF) and videos (MP4, MOV, WebM)' },
        { status: 400 }
      );
    }

    // Генерируем уникальное имя файла
    const ext = file.name.split('.').pop() || 'bin';
    const filename = `${crypto.randomUUID()}.${ext}`;
    
    // Конвертируем файл в Buffer
    const bytes = await file.arrayBuffer();
    const buffer = Buffer.from(bytes);

    // Сохраняем в БД
    const image = new Image({
      filename,
      originalName: file.name,
      mimetype: file.type,
      size: file.size,
      data: buffer,
      funnelId,
      description,
      uploadedBy: 'admin' // TODO: получать из сессии когда будет аутентификация
    });

    await image.save();

    // Возвращаем информацию без Buffer данных
    return NextResponse.json({
      id: image._id,
      filename: image.filename,
      originalName: image.originalName,
      mimetype: image.mimetype,
      size: image.size,
      uploadedAt: image.uploadedAt,
      url: `/api/images/${image.filename}`
    });

  } catch (error) {
    console.error('Image upload error:', error);
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    );
  }
}
