<?php

/**
 * Auth.php - Manejo de autenticación para la API de Mi App Windows
 * Este archivo maneja el proceso de login y validación de credenciales
 */

// Si se accede directamente, denegar acceso
//if (!defined('BASEPATH')) exit('No direct script access allowed');

// Procesar la solicitud de login
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'login') {
  // Extraer los datos de la solicitud
  $usuario = isset($datapost['usuario']) ? $datapost['usuario'] : '';
  $contrasena = isset($datapost['contrasena']) ? $datapost['contrasena'] : '';

  // Validar que se proporcionaron las credenciales
  if (empty($usuario) || empty($contrasena)) {
    sendResponse(false, "Debe proporcionar usuario y contraseña");
  }

  try {
    // Conexión a la base de datos ya establecida en api.php al incluir connect.php

    // Consulta para verificar las credenciales del usuario
    $query = "SELECT u.*, p.* FROM usuario u 
                 LEFT JOIN perfil p ON u.idPerfil = p.idPerfil 
                 WHERE u.usuario = ? LIMIT 1";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $usuario);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
      sendResponse(false, "Usuario no encontrado");
    }

    $userData = $result->fetch_assoc();
    $stored_password = $userData['contrasena']; // Hash almacenado en la BD

    // Si la contraseña almacenada comienza con * (formato PASSWORD() de MySQL)
    if (substr($stored_password, 0, 1) === '*') {
      // Verificar usando MySQL PASSWORD()
      $verify_query = "SELECT IF(PASSWORD(?) = ?, 'true', 'false') as matches";
      $verify_stmt = $conn->prepare($verify_query);
      $verify_stmt->bind_param("ss", $contrasena, $stored_password);
      $verify_stmt->execute();
      $verify_result = $verify_stmt->get_result();
      $verify_row = $verify_result->fetch_assoc();

      if ($verify_row['matches'] !== 'true') {
        sendResponse(false, "Contraseña incorrecta");
      }
    } else {
      // Si es un hash generado por password_hash() de PHP
      if (!password_verify($contrasena, $stored_password)) {
        sendResponse(false, "Contraseña incorrecta");
      }
    }

    // Obtener información del módulo actual
    $ip = $_SERVER['REMOTE_ADDR'];
    $ejecucion = 'main';

    // Verificar si el módulo ya existe
    $queryModule = "SELECT * FROM modulo WHERE ip = ? LIMIT 1";
    $stmtModule = $conn->prepare($queryModule);
    $stmtModule->bind_param("s", $ip);
    $stmtModule->execute();
    $resultModule = $stmtModule->get_result();

    if ($resultModule->num_rows === 0) {
      // Registrar el nuevo módulo
      $equipo = gethostname() ?: 'unknown';
      $insertModule = "INSERT INTO modulo (ip, ejecucion, equipo, enviadoServicio) VALUES (?, ?, ?, 0)";
      $stmtInsert = $conn->prepare($insertModule);
      $stmtInsert->bind_param("sss", $ip, $ejecucion, $equipo);
      $stmtInsert->execute();
      $idModulo = $conn->insert_id;
    } else {
      $moduleData = $resultModule->fetch_assoc();
      $idModulo = $moduleData['idModulo'];

      // Actualizar datos del módulo
      $updateModule = "UPDATE modulo SET ejecucion = ? WHERE idModulo = ?";
      $stmtUpdate = $conn->prepare($updateModule);
      $stmtUpdate->bind_param("si", $ejecucion, $idModulo);
      $stmtUpdate->execute();
    }

    // NUEVO: Obtener datos de la tabla system
    $querySystem = "SELECT * FROM system LIMIT 1";
    $resultSystem = $conn->query($querySystem);
    $systemData = $resultSystem->fetch_assoc();

    // NUEVO: Obtener datos de la tabla configuracion
    $queryConfig = "SELECT * FROM configuracion LIMIT 1";
    $resultConfig = $conn->query($queryConfig);
    $configData = $resultConfig->fetch_assoc();

    // Preparar la información a devolver
    // Eliminar la contraseña por seguridad
    unset($userData['contrasena']);

    // Crear un token de sesión (básico)
    $token = md5($usuario . time() . $tokenID);

    // Preparar la respuesta
    $response = [
      'usuario' => $userData,
      'modulo' => [
        'idModulo' => $idModulo,
        'ip' => $ip,
        'ejecucion' => $ejecucion
      ],
      'token' => $token,
      'system' => $systemData,       // NUEVO: Incluir datos de system
      'configuracion' => $configData // NUEVO: Incluir datos de configuracion
    ];

    sendResponse(true, "Inicio de sesión exitoso", $response);
  } catch (Exception $e) {
    sendResponse(false, "Error en el servidor: " . $e->getMessage());
  }
}

// Si se solicita información de perfiles
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPerfiles') {
  try {
    $query = "SELECT * FROM perfil";
    $result = $conn->query($query);

    $perfiles = [];
    while ($row = $result->fetch_assoc()) {
      $perfiles[] = $row;
    }

    sendResponse(true, "Perfiles obtenidos correctamente", $perfiles);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener perfiles: " . $e->getMessage());
  }
}

// Si se solicita información de un perfil específico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPerfil') {
  $idPerfil = isset($datapost['idPerfil']) ? $datapost['idPerfil'] : 0;

  if (empty($idPerfil)) {
    sendResponse(false, "Debe proporcionar el ID del perfil");
  }

  try {
    $query = "SELECT * FROM perfil WHERE idPerfil = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idPerfil);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
      sendResponse(false, "Perfil no encontrado");
    }

    $perfil = $result->fetch_assoc();
    sendResponse(true, "Perfil obtenido correctamente", $perfil);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener el perfil: " . $e->getMessage());
  }
}

// Si se solicita información de módulos
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getModulos') {
  try {
    $query = "SELECT * FROM modulo";
    $result = $conn->query($query);

    $modulos = [];
    while ($row = $result->fetch_assoc()) {
      $modulos[] = $row;
    }

    sendResponse(true, "Módulos obtenidos correctamente", $modulos);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener módulos: " . $e->getMessage());
  }
}

// Si se solicita registrar o actualizar un módulo
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'registrarModulo') {
  $ip = isset($datapost['ip']) ? $datapost['ip'] : $_SERVER['REMOTE_ADDR'];
  $equipo = isset($datapost['equipo']) ? $datapost['equipo'] : (gethostname() ?: 'unknown');
  $ejecucion = isset($datapost['ejecucion']) ? $datapost['ejecucion'] : 'main';

  try {
    // Verificar si el módulo ya existe
    $queryModule = "SELECT * FROM modulo WHERE ip = ? LIMIT 1";
    $stmtModule = $conn->prepare($queryModule);
    $stmtModule->bind_param("s", $ip);
    $stmtModule->execute();
    $resultModule = $stmtModule->get_result();

    if ($resultModule->num_rows === 0) {
      // Registrar el nuevo módulo
      $insertModule = "INSERT INTO modulo (ip, ejecucion, equipo, enviadoServicio) VALUES (?, ?, ?, 0)";
      $stmtInsert = $conn->prepare($insertModule);
      $stmtInsert->bind_param("sss", $ip, $ejecucion, $equipo);
      $stmtInsert->execute();
      $idModulo = $conn->insert_id;
      $mensaje = "Módulo registrado correctamente";
    } else {
      $moduleData = $resultModule->fetch_assoc();
      $idModulo = $moduleData['idModulo'];

      // Actualizar datos del módulo
      $updateModule = "UPDATE modulo SET ejecucion = ?, equipo = ? WHERE idModulo = ?";
      $stmtUpdate = $conn->prepare($updateModule);
      $stmtUpdate->bind_param("ssi", $ejecucion, $equipo, $idModulo);
      $stmtUpdate->execute();
      $mensaje = "Módulo actualizado correctamente";
    }

    $response = [
      'idModulo' => $idModulo,
      'ip' => $ip,
      'equipo' => $equipo,
      'ejecucion' => $ejecucion
    ];

    sendResponse(true, $mensaje, $response);
  } catch (Exception $e) {
    sendResponse(false, "Error al registrar módulo: " . $e->getMessage());
  }
}

// Si no se reconoce el tipo de solicitud
sendResponse(false, "Tipo de solicitud de autenticación no reconocida");
