import multer from 'multer'
import fs from 'fs/promises'
import path from 'path'
import { getUserFromToken, hasAnyRole } from '../../utils/auth.js'
import { assertPdfMagicHeader } from '../../utils/upload-validation.js'

// Multer-Konfiguration für PDF-Uploads
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadPath = path.join(process.cwd(), 'public', 'documents', 'spielplaene')
    cb(null, uploadPath)
  },
  filename: (req, file, cb) => {
    // WICHTIG: Validieren, bevor der Dateiname gebaut wird (sonst Pfad-/Filename-Injection möglich)
    const type = String(req.body?.type || '').trim()
    const safeType = ['gesamt', 'erwachsene', 'nachwuchs'].includes(type) ? type : 'invalid'
    const filename = `spielplan_${safeType}.pdf`
    cb(null, filename)
  }
})

const upload = multer({ 
  storage: storage,
  fileFilter: (req, file, cb) => {
    if (file.mimetype === 'application/pdf') {
      cb(null, true)
    } else {
      cb(new Error('Nur PDF-Dateien sind erlaubt'), false)
    }
  },
  limits: {
    fileSize: 10 * 1024 * 1024 // 10MB Limit
  }
})

export default defineEventHandler(async (event) => {
  try {
    let token = getCookie(event, 'auth_token')

    if (!token) {
      const authHeader = getHeader(event, 'authorization')
      if (authHeader && authHeader.startsWith('Bearer ')) {
        token = authHeader.substring(7).trim()
      }
    }

    if (!token) {
      throw createError({
        statusCode: 401,
        statusMessage: 'Nicht authentifiziert'
      })
    }

    const currentUser = await getUserFromToken(token)

    if (!currentUser) {
      throw createError({
        statusCode: 401,
        statusMessage: 'Nicht authentifiziert'
      })
    }

    if (!hasAnyRole(currentUser, 'admin', 'vorstand')) {
      throw createError({
        statusCode: 403,
        statusMessage: 'Keine Berechtigung'
      })
    }

    // Multer-Middleware für multipart/form-data
    await new Promise((resolve, reject) => {
      upload.single('pdf')(event.node.req, event.node.res, (err) => {
        if (err) {
          reject(err)
        } else {
          resolve()
        }
      })
    })

    const file = event.node.req.file
    const type = event.node.req.body.type

    if (!file) {
      throw createError({
        statusCode: 400,
        statusMessage: 'Keine Datei hochgeladen'
      })
    }

    await assertPdfMagicHeader(file.path)

    if (!type || !['gesamt', 'erwachsene', 'nachwuchs'].includes(type)) {
      // Lösche die hochgeladene Datei
      await fs.unlink(file.path)
      throw createError({
        statusCode: 400,
        statusMessage: 'Ungültiger Typ'
      })
    }

    return {
      success: true,
      message: `PDF für ${type} erfolgreich hochgeladen`,
      filename: file.filename,
      originalName: file.originalname
    }

  } catch (error) {
    console.error('Fehler beim PDF-Upload:', error)
    
    if (error.statusCode) {
      throw error
    }
    
    if (error.code === 'LIMIT_FILE_SIZE') {
      throw createError({
        statusCode: 413,
        statusMessage: 'Datei zu groß (max. 10MB)'
      })
    }
    
    if (error.message === 'Nur PDF-Dateien sind erlaubt') {
      throw createError({
        statusCode: 400,
        statusMessage: 'Nur PDF-Dateien sind erlaubt'
      })
    }
    
    throw createError({
      statusCode: 500,
      statusMessage: 'Fehler beim Hochladen der PDF-Datei'
    })
  }
})
