<?php

namespace App\Services;

use App\Models\Uuid;
use Illuminate\Support\Facades\DB;

class UuidService
{
    /**
     * Listar todos los UUIDs con paginación y búsqueda
     */
    public function listUuids(?string $searchTerm = null, int $perPage = 10)
    {
        $query = Uuid::with('user')
            ->orderBy('status', 'asc') // Primero los inactivos para aprobación rápida
            ->orderBy('id', 'desc');

        if ($searchTerm && trim($searchTerm) !== '') {
            $query->where(function ($q) use ($searchTerm) {
                $q->where('uuid', 'like', "%{$searchTerm}%")
                  ->orWhereHas('user', function ($uq) use ($searchTerm) {
                      $uq->where('name', 'like', "%{$searchTerm}%")
                        ->orWhere('username', 'like', "%{$searchTerm}%");
                  });
            });
        }

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

    /**
     * Crear o actualizar un UUID para garantizar un único dispositivo por cuenta de usuario
     */
    public function createUuid(array $data)
    {
        return DB::transaction(function () use ($data) {
            // 1. Validar que el UUID no esté en uso por otra cuenta
            $existingUuid = Uuid::where('uuid', $data['uuid'])->first();
            if ($existingUuid && $existingUuid->user_id != $data['user_id']) {
                throw new \Exception('Este dispositivo ya está vinculado a otra cuenta de usuario.');
            }

            // 2. Buscar si el usuario ya tiene algún UUID registrado
            $userUuid = Uuid::where('user_id', $data['user_id'])->first();
            if ($userUuid) {
                // Actualizar el UUID existente del usuario
                $userUuid->update([
                    'uuid' => $data['uuid'],
                    'status' => $data['status'] ?? 1
                ]);
                return $userUuid;
            }

            // 3. Si no tiene, crear un nuevo registro
            return Uuid::create([
                'user_id' => $data['user_id'],
                'uuid' => $data['uuid'],
                'status' => $data['status'] ?? 1
            ]);
        });
    }

    /**
     * Actualizar estado o datos de un UUID
     */
    public function updateUuid($id, array $data)
    {
        return DB::transaction(function () use ($id, $data) {
            $uuid = Uuid::findOrFail($id);
            $uuid->update($data);
            return $uuid;
        });
    }

    /**
     * Eliminar un UUID
     */
    public function deleteUuid($id)
    {
        return DB::transaction(function () use ($id) {
            $uuid = Uuid::findOrFail($id);
            return $uuid->delete();
        });
    }
}
