<?php
require_once __DIR__ . '/../../config/auth.php';

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) ?: 0;
$editando = $id > 0;
$errores = [];
$datos = [
    'usuario' => '',
    'nombre' => '',
    'email' => '',
    'rol_id' => '',
    'tipo_usuario_id' => '',
    'colaboradores_ids' => [],
    'supervisa_tipos' => [],
    'activo' => 1,
];

if ($editando) {
    $stmt = $conn->prepare('SELECT id, usuario, nombre, email, rol_id, tipo_usuario_id, colaborador_id, activo FROM usuarios WHERE id = ?');
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $resultado = $stmt->get_result();
    $datos = $resultado->fetch_assoc();
    $stmt->close();

    if (!$datos) {
        http_response_code(404);
        exit('Usuario no encontrado.');
    }
    $datos['supervisa_tipos']=[];
    $supervisados=$conn->query('SELECT tipo_usuario_id FROM usuario_supervisa_tipos WHERE usuario_id='.(int)$id);
    while($supervisado=$supervisados->fetch_assoc())$datos['supervisa_tipos'][]=(int)$supervisado['tipo_usuario_id'];
    $datos['colaboradores_ids']=[];$vinculados=$conn->query('SELECT colaborador_id FROM usuario_colaboradores WHERE usuario_id='.(int)$id);while($vinculado=$vinculados->fetch_assoc())$datos['colaboradores_ids'][]=(int)$vinculado['colaborador_id'];if(!$datos['colaboradores_ids']&&!empty($datos['colaborador_id']))$datos['colaboradores_ids'][]=(int)$datos['colaborador_id'];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT) ?: 0;
    $editando = $id > 0;
    $datos = [
        'usuario' => limpiar($_POST['usuario'] ?? ''),
        'nombre' => limpiar($_POST['nombre'] ?? ''),
        'email' => limpiar($_POST['email'] ?? ''),
        'rol_id' => filter_input(INPUT_POST, 'rol_id', FILTER_VALIDATE_INT) ?: null,
        'tipo_usuario_id' => filter_input(INPUT_POST, 'tipo_usuario_id', FILTER_VALIDATE_INT) ?: null,
        'colaboradores_ids' => array_values(array_unique(array_filter(array_map('intval',(array)($_POST['colaboradores_ids']??[]))))),
        'supervisa_tipos' => array_values(array_unique(array_filter(array_map('intval',(array)($_POST['supervisa_tipos']??[]))))),
        'activo' => isset($_POST['activo']) ? 1 : 0,
    ];
    $password = $_POST['password'] ?? '';
    $colaboradorPrincipal=$datos['colaboradores_ids'][0]??null;

    if ($datos['usuario'] === '') $errores[] = 'El usuario es obligatorio.';
    if ($datos['nombre'] === '') $errores[] = 'El nombre es obligatorio.';
    if ($datos['email'] !== '' && !filter_var($datos['email'], FILTER_VALIDATE_EMAIL)) {
        $errores[] = 'El correo electrónico no es válido.';
    }
    if (!$editando && strlen($password) < 8) {
        $errores[] = 'La contraseña inicial debe tener al menos 8 caracteres.';
    }
    if ($password !== '' && strlen($password) < 8) {
        $errores[] = 'La contraseña debe tener al menos 8 caracteres.';
    }

    $stmt = $conn->prepare('SELECT id FROM usuarios WHERE (usuario = ? OR (? <> "" AND email = ?)) AND id <> ? LIMIT 1');
    $stmt->bind_param('sssi', $datos['usuario'], $datos['email'], $datos['email'], $id);
    $stmt->execute();
    if ($stmt->get_result()->fetch_assoc()) {
        $errores[] = 'El usuario o correo electrónico ya está registrado.';
    }
    $stmt->close();

    if (!$errores) {
        $email = $datos['email'] !== '' ? $datos['email'] : null;
        if ($editando) {
            if ($password !== '') {
                $hash = password_hash($password, PASSWORD_DEFAULT);
                $stmt = $conn->prepare(
                    'UPDATE usuarios SET rol_id=?, tipo_usuario_id=?, colaborador_id=?, usuario=?, nombre=?, email=?, password_hash=?, activo=? WHERE id=?'
                );
                $stmt->bind_param('iiissssii', $datos['rol_id'], $datos['tipo_usuario_id'], $colaboradorPrincipal, $datos['usuario'], $datos['nombre'], $email, $hash, $datos['activo'], $id);
            } else {
                $stmt = $conn->prepare(
                    'UPDATE usuarios SET rol_id=?, tipo_usuario_id=?, colaborador_id=?, usuario=?, nombre=?, email=?, activo=? WHERE id=?'
                );
                $stmt->bind_param('iiisssii', $datos['rol_id'], $datos['tipo_usuario_id'], $colaboradorPrincipal, $datos['usuario'], $datos['nombre'], $email, $datos['activo'], $id);
            }
            $accion = 'UPDATE';
            $detalle = 'Actualización de usuario';
        } else {
            $hash = password_hash($password, PASSWORD_DEFAULT);
            $stmt = $conn->prepare(
                'INSERT INTO usuarios (rol_id, tipo_usuario_id, colaborador_id, usuario, nombre, email, password_hash, activo) VALUES (?, ?, ?, ?, ?, ?, ?, ?)'
            );
            $stmt->bind_param('iiissssi', $datos['rol_id'], $datos['tipo_usuario_id'], $colaboradorPrincipal, $datos['usuario'], $datos['nombre'], $email, $hash, $datos['activo']);
            $accion = 'INSERT';
            $detalle = 'Alta de usuario';
        }

        if ($stmt->execute()) {
            $registro_id = $editando ? $id : $stmt->insert_id;
            $conn->query('DELETE FROM usuario_supervisa_tipos WHERE usuario_id='.(int)$registro_id);
            if($datos['supervisa_tipos']){$supervisa=$conn->prepare('INSERT INTO usuario_supervisa_tipos(usuario_id,tipo_usuario_id) VALUES(?,?)');foreach($datos['supervisa_tipos'] as $tipoSupervisado){$supervisa->bind_param('ii',$registro_id,$tipoSupervisado);$supervisa->execute();}$supervisa->close();}
            $conn->query('DELETE FROM usuario_colaboradores WHERE usuario_id='.(int)$registro_id);if($datos['colaboradores_ids']){$vincular=$conn->prepare('INSERT INTO usuario_colaboradores(usuario_id,colaborador_id) VALUES(?,?)');foreach($datos['colaboradores_ids'] as $colaboradorVinculado){$vincular->bind_param('ii',$registro_id,$colaboradorVinculado);$vincular->execute();}$vincular->close();}
            registrar_auditoria($conn, $accion, 'usuarios', $registro_id, $detalle);
            $_SESSION['flash_mensaje'] = $editando ? 'Usuario actualizado correctamente.' : 'Usuario creado correctamente.';
            $_SESSION['flash_tipo'] = 'success';
            $stmt->close();
            header('Location: /HM/modules/usuarios/index.php');
            exit;
        }

        $errores[] = 'No fue posible guardar el usuario.';
        $stmt->close();
    }
}

$roles = $conn->query('SELECT id, nombre FROM roles ORDER BY nombre');
$tiposUsuario = $conn->query('SELECT id,nombre FROM tipos_usuario WHERE activo=1 ORDER BY nombre');
$tiposSupervision = $conn->query('SELECT id,nombre FROM tipos_usuario WHERE activo=1 ORDER BY nombre');
$colaboradores = $conn->query("SELECT id,CONCAT(apellidos, ', ', nombres) nombre FROM colaboradores WHERE estado='Activo' ORDER BY apellidos,nombres");
include __DIR__ . '/../../includes/header.php';
include __DIR__ . '/../../includes/sidebar.php';
?>
<main class="main">
  <?php include __DIR__ . '/../../includes/topbar.php'; ?>
  <div class="content">
    <div class="mb-4">
      <a class="text-decoration-none" href="/HM/modules/usuarios/index.php">
        <i class="fa fa-arrow-left me-1"></i> Volver a usuarios
      </a>
      <h3 class="page-title mt-2 mb-0"><?= $editando ? 'Editar usuario' : 'Nuevo usuario' ?></h3>
    </div>

    <?php if ($errores): ?>
      <div class="alert alert-danger">
        <ul class="mb-0">
          <?php foreach ($errores as $error): ?><li><?= e($error) ?></li><?php endforeach; ?>
        </ul>
      </div>
    <?php endif; ?>

    <div class="card card-hm">
      <div class="card-body p-4">
        <form method="post">
          <input type="hidden" name="id" value="<?= (int) $id ?>">
          <div class="row g-3">
            <div class="col-md-6">
              <label class="form-label" for="nombre">Nombre completo *</label>
              <input class="form-control" id="nombre" name="nombre" value="<?= e($datos['nombre']) ?>" required>
            </div>
            <div class="col-md-6">
              <label class="form-label" for="usuario">Usuario *</label>
              <input class="form-control" id="usuario" name="usuario" value="<?= e($datos['usuario']) ?>" required autocomplete="off">
            </div>
            <div class="col-md-6">
              <label class="form-label" for="email">Correo electrónico</label>
              <input class="form-control" id="email" type="email" name="email" value="<?= e($datos['email']) ?>">
            </div>
            <div class="col-md-6">
              <label class="form-label" for="rol_id">Rol</label>
              <select class="form-select" id="rol_id" name="rol_id">
                <option value="">Sin rol</option>
                <?php while ($rol = $roles->fetch_assoc()): ?>
                  <option value="<?= (int) $rol['id'] ?>" <?= (int) $datos['rol_id'] === (int) $rol['id'] ? 'selected' : '' ?>>
                    <?= e($rol['nombre']) ?>
                  </option>
                <?php endwhile; ?>
              </select>
            </div>
            <div class="col-md-6"><label class="form-label" for="tipo_usuario_id">Tipo de usuario</label><select class="form-select" id="tipo_usuario_id" name="tipo_usuario_id"><option value="">Sin tipo</option><?php while($tipoUsuario=$tiposUsuario->fetch_assoc()):?><option value="<?=$tipoUsuario['id']?>" <?=(int)$datos['tipo_usuario_id']===(int)$tipoUsuario['id']?'selected':''?>><?=e($tipoUsuario['nombre'])?></option><?php endwhile;?></select></div>
            <div class="col-md-6"><label class="form-label" for="colaboradores_ids">Funcionarios vinculados</label><select class="form-select" id="colaboradores_ids" name="colaboradores_ids[]" multiple size="6"><?php while($colaborador=$colaboradores->fetch_assoc()):?><option value="<?=$colaborador['id']?>" <?=in_array((int)$colaborador['id'],$datos['colaboradores_ids'],true)?'selected':''?>><?=e($colaborador['nombre'])?></option><?php endwhile;?></select><div class="form-text">Puede seleccionar más de un funcionario. Mantenga Ctrl presionado para seleccionar varios.</div></div>
            <div class="col-12"><label class="form-label" for="supervisa_tipos">Supervisa a</label><select class="form-select" id="supervisa_tipos" name="supervisa_tipos[]" multiple size="5"><?php while($tipoSupervision=$tiposSupervision->fetch_assoc()):?><option value="<?=$tipoSupervision['id']?>" <?=in_array((int)$tipoSupervision['id'],$datos['supervisa_tipos'],true)?'selected':''?>><?=e($tipoSupervision['nombre'])?></option><?php endwhile;?></select><div class="form-text">Podrá ver las tareas asignadas a los funcionarios vinculados con usuarios de estos tipos. Sin seleccionar ninguno, cada usuario ve sus propias tareas y las que creó.</div></div>
            <div class="col-md-6">
              <label class="form-label" for="password"><?= $editando ? 'Nueva contraseña' : 'Contraseña inicial *' ?></label>
              <input class="form-control" id="password" type="password" name="password" <?= $editando ? '' : 'required' ?> autocomplete="new-password">
              <div class="password-note mt-1">
                Mínimo 8 caracteres. <?= $editando ? 'Déjela vacía para conservar la actual.' : '' ?>
              </div>
            </div>
            <div class="col-md-6 d-flex align-items-end">
              <div class="form-check form-switch mb-2">
                <input class="form-check-input" id="activo" type="checkbox" name="activo" <?= $datos['activo'] ? 'checked' : '' ?>>
                <label class="form-check-label" for="activo">Usuario activo</label>
              </div>
            </div>
          </div>
          <div class="d-flex gap-2 mt-4">
            <button class="btn btn-hm" type="submit"><i class="fa fa-save me-1"></i> Guardar</button>
            <a class="btn btn-outline-secondary" href="/HM/modules/usuarios/index.php">Cancelar</a>
          </div>
        </form>
      </div>
    </div>
  </div>
</main>
<?php include __DIR__ . '/../../includes/footer.php'; ?>
