import { getUserFromToken, hasAnyRole } from '../utils/auth.js'
import { saveMember } from '../utils/members.js'

export default defineEventHandler(async (event) => {
  try {
    // Support both Cookie and Authorization Header
    let token = getCookie(event, 'auth_token')
    
    // If no cookie token, try Authorization header (Bearer token)
    if (!token) {
      const authHeader = getHeader(event, 'authorization')
      if (authHeader && authHeader.startsWith('Bearer ')) {
        token = authHeader.substring(7)
      }
    }

    if (!token) {
      throw createError({
        statusCode: 401,
        message: 'Nicht authentifiziert. Bitte Token im Cookie oder Authorization-Header bereitstellen.'
      })
    }

    const user = await getUserFromToken(token)

    if (!user) {
      throw createError({
        statusCode: 401,
        message: 'Nicht authentifiziert oder Benutzer nicht gefunden.'
      })
    }

    // Only admin and vorstand can add/edit members
    if (!hasAnyRole(user, 'admin', 'vorstand')) {
      throw createError({
        statusCode: 403,
        message: 'Keine Berechtigung zum Hinzufügen/Bearbeiten von Mitgliedern. Erforderlich: admin oder vorstand Rolle.'
      })
    }

  const body = await readBody(event)
  const { id, firstName, lastName, geburtsdatum, email, phone, address, notes, isMannschaftsspieler, hasHallKey, hasHallenschluessel, active } = body

    if (!firstName || !lastName) {
      throw createError({
        statusCode: 400,
        message: 'Vorname und Nachname sind erforderlich.'
      })
    }

    if (!geburtsdatum && !id) {
      throw createError({
        statusCode: 400,
        message: 'Geburtsdatum ist für neue Mitglieder erforderlich, um Duplikate zu vermeiden.'
      })
    }

    try {
      await saveMember({
        id: id || undefined,
        firstName,
        lastName,
        geburtsdatum: geburtsdatum || '',
        email: email || '',
        phone: phone || '',
        address: address || '',
        notes: notes || '',
        isMannschaftsspieler: isMannschaftsspieler === true || isMannschaftsspieler === 'true',
        hasHallKey: hasHallKey === true || hasHallKey === 'true' || hasHallenschluessel === true || hasHallenschluessel === 'true',
        active: typeof active === 'boolean' ? active : true
      })

      return {
        success: true,
        message: 'Mitglied erfolgreich gespeichert.'
      }
    } catch (memberError) {
      // Check if it's a duplicate error
      if (memberError.message && memberError.message.includes('existiert bereits')) {
        throw createError({
          statusCode: 409,
          message: memberError.message
        })
      }
      // Re-throw other errors
      throw memberError
    }
  } catch (error) {
    console.error('Fehler beim Speichern des Mitglieds:', error)
    // If it's already a createError, re-throw it
    if (error.statusCode) {
      throw error
    }
    // Otherwise wrap it
    throw createError({
      statusCode: error.statusCode || 500,
      message: error.message || 'Fehler beim Speichern des Mitglieds.'
    })
  }
})

