// services/auth/src/ak.js
import axios from 'axios';

const AK = axios.create({
  baseURL: `${process.env.AUTHENTIK_BASE_URL}/api/v3`,
  headers: { Authorization: `Bearer ${process.env.AUTHENTIK_TOKEN}` },
  timeout: 10000,
});

// Busca usuario por email (case-insensitive)
export async function akFindUserByEmail(email) {
  const { data } = await AK.get('/core/users/', { params: { search: email }});
  // filtra exacto por email si querés evitar colisiones de 'search'
  return data.results?.find(u => (u.email || '').toLowerCase() === email.toLowerCase()) || null;
}

// Crea usuario en Authentik con atributo tenant_uuid y lo agrega a un grupo (opcional)
export async function akCreateUser({ email, displayName, tenantUuid, addToGroupId }) {
  // 1) crear usuario
  const { data: user } = await AK.post('/core/users/', {
    username: email,               // en Authentik el username puede ser el email
    name: displayName || email,
    email,
    is_active: true,
    attributes: { tenant_uuid: tenantUuid }, // <-- para tu claim custom
  });

  // 2) agregar a grupo por defecto (opcional)
  if (addToGroupId) {
    await AK.post(`/core/users/${user.pk}/groups/`, { group: addToGroupId });
  }

  return user; // contiene pk y uuid
}

// Opcional: setear/forzar password inicial (si querés flujo con password local en Authentik)
export async function akSetPassword(userPk, password, requireChange = true) {
  try {
    await AK.post(`/core/users/${userPk}/set_password/`, {
      password, require_change: requireChange,
    });
  } catch (e) {
    // Si tu instancia no permite setear password por API, capturá y usá un flow de "reset password"
    throw new Error('No se pudo establecer la contraseña en Authentik por API');
  }
}
