import { readFile, writeFile, mkdir } from 'fs/promises'
import { existsSync } from 'fs'
import { join } from 'path'

/**
 * API endpoint para actualizar el alias de un contacto
 * PUT /api/contacts/aliases/:id
 */
export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig()
  const headers = getRequestHeaders(event)

  // Verificar autenticación
  const uid = headers['x-authentik-uid']
  if (!uid) {
    throw createError({
      statusCode: 401,
      message: 'Usuario no autenticado'
    })
  }

  // Obtener ID del contacto desde la ruta
  const contactId = getRouterParam(event, 'id')
  if (!contactId) {
    throw createError({
      statusCode: 400,
      message: 'ID de contacto requerido'
    })
  }

  // Leer body
  const body = await readBody(event)
  const alias = body?.alias?.toString().trim() || ''

  // Validar alias (max 50 caracteres)
  if (alias.length > 50) {
    throw createError({
      statusCode: 400,
      message: 'El alias no puede tener más de 50 caracteres'
    })
  }

  // Sanitizar UID para usar como nombre de archivo
  const safeUid = uid.replace(/[^a-zA-Z0-9-_]/g, '_')

  // Ruta del archivo de aliases
  const dataDir = config.dataDir || './data'
  const aliasesDir = join(dataDir, 'contact-aliases')
  const aliasesFile = join(aliasesDir, `${safeUid}.json`)

  try {
    // Crear directorio si no existe
    if (!existsSync(aliasesDir)) {
      await mkdir(aliasesDir, { recursive: true })
    }

    // Leer aliases existentes
    let aliases: Record<string, string> = {}
    if (existsSync(aliasesFile)) {
      const content = await readFile(aliasesFile, 'utf-8')
      aliases = JSON.parse(content)
    }

    // Actualizar o eliminar alias
    if (alias) {
      aliases[contactId] = alias
    } else {
      delete aliases[contactId]
    }

    // Guardar archivo
    await writeFile(aliasesFile, JSON.stringify(aliases, null, 2), 'utf-8')

    return {
      success: true,
      contactId,
      alias: alias || null
    }
  } catch (error: any) {
    console.error('Error al actualizar alias:', error)
    throw createError({
      statusCode: 500,
      message: 'Error al actualizar el alias'
    })
  }
})
