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

// Тип для MongoDB Binary объекта из BSON
interface MongoDBBinary {
  buffer?: ArrayBuffer | Buffer;
  _bsontype?: string;
}

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

    await connectMongoDB();

    const { filename } = await params;
    
    if (!filename) {
      return NextResponse.json(
        { error: 'Filename is required' },
        { status: 400 }
      );
    }

    const image = await Image.findOne({ filename }).lean() as IImage | null;

    if (!image) {
      return NextResponse.json(
        { error: 'Image not found' },
        { status: 404 }
      );
    }

    // Возвращаем изображение с правильными заголовками
    // Преобразуем MongoDB Binary в Buffer
    let buffer: Buffer;
    const rawData = image.data as unknown;
    
    if (Buffer.isBuffer(rawData)) {
      buffer = rawData;
    } else if ((rawData as MongoDBBinary)?.buffer) {
      // BSON Binary объект имеет свойство buffer
      const binaryData = (rawData as MongoDBBinary).buffer;
      buffer = Buffer.isBuffer(binaryData) ? binaryData : Buffer.from(binaryData as ArrayBuffer);
    } else if (rawData instanceof Uint8Array) {
      buffer = Buffer.from(rawData);
    } else {
      // Fallback - пробуем напрямую преобразовать
      buffer = Buffer.from(rawData as ArrayBuffer);
    }
    
    // Специальная обработка для SVG файлов
    let contentType = image.mimetype;
    if (filename.endsWith('.svg') && contentType === 'image/svg+xml') {
      contentType = 'image/svg+xml; charset=utf-8';
    }
    
    return new NextResponse(buffer as unknown as BodyInit, {
      status: 200,
      headers: {
        'Content-Type': contentType,
        'Content-Length': buffer.length.toString(),
        'Cache-Control': 'public, max-age=31536000, immutable',
        'Content-Disposition': `inline; filename="${image.originalName}"`,
        'Access-Control-Allow-Origin': '*',
        // Дополнительные заголовки для SVG
        'X-Content-Type-Options': 'nosniff',
      },
    });

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

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

    await connectMongoDB();

    const { filename } = await params;
    
    if (!filename) {
      return NextResponse.json(
        { error: 'Filename is required' },
        { status: 400 }
      );
    }

    const deletedImage = await Image.findOneAndDelete({ filename });

    if (!deletedImage) {
      return NextResponse.json(
        { error: 'Image not found' },
        { status: 404 }
      );
    }

    return NextResponse.json({
      message: 'Image deleted successfully',
      filename: deletedImage.filename
    });

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