<?php

require_once dirname(__DIR__, 3) . '/common/config.php';

function ldap_auth_escape_filter_value($value) {
    $value = (string)$value;

    if (function_exists('ldap_escape')) {
        if (defined('LDAP_ESCAPE_FILTER')) {
            return ldap_escape($value, '', LDAP_ESCAPE_FILTER);
        }
        return ldap_escape($value, '');
    }

    return strtr($value, [
        '\\' => '\\5c',
        '*' => '\\2a',
        '(' => '\\28',
        ')' => '\\29',
        "\x00" => '\\00',
    ]);
}

// Funcion para autenticar al usuario contra LDAP y la base de datos
function authenticateLDAPUser($username, $password) {
    // Configuracion centralizada del servidor LDAP
    $ldapServer = defined('LDAP_SERVER') ? LDAP_SERVER : '';
    $ldapRdn = defined('LDAP_BASE_DN') ? LDAP_BASE_DN : '';
    $adminDn = defined('LDAP_ADMIN_DN') ? LDAP_ADMIN_DN : '';
    $adminPassword = defined('LDAP_ADMIN_PASS') ? LDAP_ADMIN_PASS : '';

    // Validacion basica de entrada
    if (empty($username) || empty($password)) {
        error_log("Error: Credenciales de usuario vacias.");
        return false;
    }

    if ($ldapServer === '' || $ldapRdn === '' || $adminDn === '' || $adminPassword === '') {
        error_log("Error: Configuracion LDAP incompleta.");
        return false;
    }

    // Conexion al servidor LDAP
    $ldapConn = ldap_connect($ldapServer);
    if (!$ldapConn) {
        error_log("Error: No se pudo conectar al servidor LDAP.");
        return false;
    }

    // Configuracion de opciones LDAP
    ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);

    // Autenticar como administrador
    if (!@ldap_bind($ldapConn, $adminDn, $adminPassword)) {
        error_log("Error: Fallo la autenticacion del administrador LDAP.");
        return false;
    }

    // Buscar el usuario en el directorio
    $safeUsername = ldap_auth_escape_filter_value($username);
    $filter = "(sAMAccountName=$safeUsername)";
    $search = ldap_search($ldapConn, $ldapRdn, $filter);
    if (!$search) {
        error_log("Error: No se pudo buscar el usuario '$username' en el directorio LDAP.");
        return false;
    }

    $entries = ldap_get_entries($ldapConn, $search);
    if ($entries['count'] === 0) {
        error_log("Error: Usuario '$username' no encontrado en el directorio LDAP.");
        return false;
    }

    // Obtener el DN del usuario encontrado
    $userDn = $entries[0]['dn'];

    // Intentar autenticar al usuario con su contrasena
    if (!@ldap_bind($ldapConn, $userDn, $password)) {
        error_log("Error: Fallo la autenticacion del usuario '$username'.");
        return false;
    } else {
        $_SESSION['givenName'] = $entries[0]["givenname"][0] ?? "Nombre no encontrado";
        return true;
    }
}

function authenticateDBUser($username)
{
    // Verificar si el usuario existe en la base de datos
    global $db;
    $query = $db->prepare("SELECT * FROM usuarios WHERE sAMAccountName = ?");
    $query->execute([$username]);
    $user = $query->fetch(PDO::FETCH_ASSOC);

    if ($user && (empty($user['FechaBaja']) || strtotime($user['FechaBaja']) >= time())) {
        $_SESSION['userType'] = $user['Tipo'];
        return true;
    }

    return false;
}
?>
