import { NextRequest, NextResponse } from 'next/server'
import { writeFile, mkdir } from 'fs/promises'
import { existsSync } from 'fs'
import path from 'path'

export const dynamic = 'force-dynamic'

// Directory to store mugshots
const MUGSHOT_DIR = path.join(process.cwd(), 'public', 'mugshots')

export async function POST(request: NextRequest) {
  try {
    // Ensure mugshot directory exists
    if (!existsSync(MUGSHOT_DIR)) {
      await mkdir(MUGSHOT_DIR, { recursive: true })
    }

    const contentType = request.headers.get('content-type') || ''
    
    let characterId: string | null = null
    let imageBuffer: Buffer | null = null

    // Handle JSON body (base64 from FiveM server)
    if (contentType.includes('application/json')) {
      const body = await request.json()
      characterId = body.characterId
      
      if (body.imageData) {
        // imageData is base64 encoded, might have data URL prefix
        let base64Data = body.imageData
        
        // Remove data URL prefix if present
        if (base64Data.includes(',')) {
          base64Data = base64Data.split(',')[1]
        }
        
        // Remove any whitespace
        base64Data = base64Data.replace(/\s/g, '')
        
        imageBuffer = Buffer.from(base64Data, 'base64')
      }
    }
    // Handle multipart form data (direct upload)
    else if (contentType.includes('multipart/form-data')) {
      const formData = await request.formData()
      const file = formData.get('file') as File | null
      characterId = request.headers.get('X-Character-ID')

      if (file) {
        const bytes = await file.arrayBuffer()
        imageBuffer = Buffer.from(bytes)
      }
    }

    if (!characterId) {
      return NextResponse.json(
        { error: 'Missing character ID' },
        { status: 400 }
      )
    }

    if (!imageBuffer) {
      return NextResponse.json(
        { error: 'No image data provided' },
        { status: 400 }
      )
    }

    // Clean character ID for filename
    const safeCharId = characterId.replace(/[^a-zA-Z0-9_-]/g, '_')
    const filename = `${safeCharId}.png`
    const filepath = path.join(MUGSHOT_DIR, filename)

    // Write file
    await writeFile(filepath, imageBuffer)

    console.log(`[Mugshot] Saved mugshot for character: ${characterId} (${imageBuffer.length} bytes)`)

    return NextResponse.json({
      success: true,
      characterId,
      url: `/mugshots/${filename}`,
    })
  } catch (error) {
    console.error('[Mugshot] Upload error:', error)
    return NextResponse.json(
      { error: 'Upload failed', details: String(error) },
      { status: 500 }
    )
  }
}

// CORS preflight
export async function OPTIONS() {
  return new NextResponse(null, {
    status: 200,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'POST, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type, X-Character-ID, X-API-Key',
    },
  })
}
