<?php
require_once "connect.php";

class LoginModel {

  public static function mdlValidaDatos(array $todos_los_campos): array {
    $usuario  = trim($todos_los_campos['username'] ?? '');
    $password = (string)($todos_los_campos['password'] ?? '');


    if (str_contains($usuario, '@')) {
      $usuario = explode('@', $usuario, 2)[0];
      $usuario = trim($usuario);
    }

    if ($usuario === '' || $password === '') {
      return ['ok' => false, 'message' => 'Usuario y contraseña son obligatorios'];
    }

    $sql = "SELECT id_habilitado FROM dbo.aca_usuarios WHERE usuario = :username;";

    $servidor_LDAP = "argsandc1.goldbar.barrick.com";

    try {
      // 1) Verificar usuario habilitado
      $pdo  = Conexion::conectar();
      $stmt = $pdo->prepare($sql);
      $stmt->bindParam(':username', $usuario, PDO::PARAM_STR);
      $stmt->execute();

      $habilitado = $stmt->fetchColumn();
      $stmt = null;

      if ($habilitado === false) {
        return ['ok' => false, 'message' => 'Usuario inexistente'];
      }
      if ((int)$habilitado !== 1) {
        return ['ok' => false, 'message' => 'Usuario no habilitado'];
      }

      // 2) Autenticación LDAP
      error_reporting(0); // evitar warnings de LDAP en producción
      $conectado_LDAP = ldap_connect($servidor_LDAP);
      if (!$conectado_LDAP) {
        return ['ok' => false, 'message' => 'No se pudo conectar al servidor LDAP'];
      }

      ldap_set_option($conectado_LDAP, LDAP_OPT_PROTOCOL_VERSION, 3);
      ldap_set_option($conectado_LDAP, LDAP_OPT_REFERRALS, 0);

      // probar primero veladero.com y si falla barrick.com
      $dominiosPermitidos = ['veladero.com', 'barrick.com'];

      $autenticado_LDAP = false;
      $upnUsado = null;

      foreach ($dominiosPermitidos as $dom) {
        $upn = $usuario . '@' . $dom;
        if (@ldap_bind($conectado_LDAP, $upn, $password)) {
          $autenticado_LDAP = true;
          $upnUsado = $upn;
          break;
        }
      }

      if (!$autenticado_LDAP) {
        return ['ok' => false, 'message' => 'Credenciales inválidas'];
      }

      // 3) Datos de seguridad (módulo inicial, etc.)
      $sqlSeg =
        "SELECT TOP 1
          user_id,
          dni,
          usuario,
          nombre,
          rol,
          rol_id,
          modulo,
          modulo_id,
          padre,
          vista,
          icon_menu,
          vista_inicio
        FROM dbo.aca_seguridad
        WHERE UPPER(usuario) = UPPER(:usuario) AND vista_inicio = 1;";

      $stmt = $pdo->prepare($sqlSeg);
      $stmt->bindValue(':usuario', $usuario, PDO::PARAM_STR);
      $stmt->execute();

      $row = $stmt->fetch(PDO::FETCH_ASSOC);
      if (!$row) {
        return ['ok' => false, 'message' => 'Sin módulo de inicio asignado'];
      }

      if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
      }

      $_SESSION['usuario']      = strtoupper($row['usuario']);
      $_SESSION['dni']          = $row['dni'];
      $_SESSION['id']           = $row['user_id'];
      $_SESSION['rol_id']       = $row['rol_id'];
      $_SESSION['rol']          = $row['rol'];
      $_SESSION['nombre']       = $row['nombre'];
      $_SESSION['inicio_ts']    = time();
      $_SESSION['vista_inicio'] = $row['vista'];

      // (Opcional, si te sirve para auditoría)
      // $_SESSION['upn'] = $upnUsado;

      // 5) Armar redirect (usa vista si viene, si no vuelve al home)
      $redirect = $_SESSION['vista_inicio'] ?: 'index.php';

      return [
        'ok'       => true,
        'message'  => 'Login OK',
        'redirect' => $redirect,
        'data'     => $row,
      ];
    } catch (Throwable $e) {
      return ['ok' => false, 'message' => 'Error interno'];
    }
  }

  public static function mdlObtenerMenuUsuario(string $user_name): array {
    $pdo = Conexion::conectar();
    $sql = "SELECT modulo_id, modulo, icon_menu, vista, vista_inicio, padre
          FROM aca_seguridad
          WHERE UPPER(usuario) = UPPER(:user_name) AND padre IS NULL
          ORDER BY modulo_id;";
    $st = $pdo->prepare($sql);
    $st->execute([':user_name' => $user_name]);
    return $st->fetchAll(PDO::FETCH_OBJ);
  }

  public static function mdlObtenerSubMenuUsuario(int $idMenu, string $user_name): array {
    $pdo = Conexion::conectar();
    $sql = "SELECT modulo_id, modulo, icon_menu, vista, vista_inicio, padre
          FROM aca_seguridad
          WHERE UPPER(usuario) = UPPER(:user_name) AND padre = :idMenu
          ORDER BY modulo_id;";
    $st = $pdo->prepare($sql);
    $st->execute([':user_name' => $user_name, ':idMenu' => $idMenu]);
    return $st->fetchAll(PDO::FETCH_OBJ);
  }
}
