<?php

namespace App\Services;

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;

class UserService
{
    /**
     * Obtener el listado de todos los usuarios (con paginación y búsqueda opcional)
     */
    public function listUsers(?string $searchTerm = null, int $perPage = 10)
    {
        $query = User::orderBy('online_status', 'desc')
            ->orderBy('role', 'asc')
            ->orderBy('level', 'asc')
            ->orderBy('id', 'desc');

        if ($searchTerm && trim($searchTerm) !== '') {
            $query->where(function ($q) use ($searchTerm) {
                $q->where('name', 'like', "%{$searchTerm}%")
                  ->orWhere('username', 'like', "%{$searchTerm}%")
                  ->orWhere('email', 'like', "%{$searchTerm}%");
            });
        } else {
            // Por defecto, mostrar únicamente usuarios que están en línea
            $query->where('online_status', true);
        }

        return $query->paginate($perPage);
    }

    /**
     * Crear un nuevo usuario hasheando su contraseña
     */
    public function createUser(array $data)
    {
        return DB::transaction(function () use ($data) {
            $data['password'] = Hash::make($data['password']);
            // Estandarizar valores por defecto si no vienen
            if (!isset($data['user_status'])) {
                $data['user_status'] = true;
            }
            $data['online_status'] = false;

            return User::create($data);
        });
    }

    /**
     * Actualizar los datos de un usuario
     */
    public function updateUser($id, array $data)
    {
        return DB::transaction(function () use ($id, $data) {
            $user = User::findOrFail($id);

            // Si se envió una nueva contraseña, hashearla. De lo contrario, eliminarla para no sobreescribir.
            if (isset($data['password']) && filled($data['password'])) {
                $data['password'] = Hash::make($data['password']);
            } else {
                unset($data['password']);
            }

            $user->update($data);
            return $user;
        });
    }

    /**
     * Eliminar un usuario (los UUIDs asociados se borran por cascade en MySQL)
     */
    public function deleteUser($id)
    {
        return DB::transaction(function () use ($id) {
            $user = User::findOrFail($id);
            return $user->delete();
        });
    }
}
