<?php

namespace Tests\Support;

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

trait CreatesAdminApiUser
{
    /**
     * Construye un admin con token Sanctum y registro de dispositivo para pasar
     * por los middlewares reales de autenticación, abilities y uuid-check.
     *
     * @return array{0: Admin, 1: string, 2: string}
     */
    protected function createAdminApiUser(bool $isRoot = true): array
    {
        $deviceId = DB::query()->from('devices')->insertGetId([
            'titulo' => 'Desktop',
            'slug' => 'desktop',
            'icono' => null,
            'estado' => true,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        $osId = DB::query()->from('devices_operative_systems')->insertGetId([
            'titulo' => 'Linux',
            'platform' => 'linux',
            'slug' => 'linux',
            'imagen' => null,
            'estado' => true,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        $browserId = DB::query()->from('browsers')->insertGetId([
            'titulo' => 'Firefox',
            'slug' => 'firefox',
            'type' => 'browser',
            'imagen' => null,
            'estado' => true,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        $personaId = DB::query()->from('personas')->insertGetId([
            'cedula' => null,
            'nombre' => 'Soporte',
            'apellido' => 'Xnet',
            'imagen' => null,
            'estado' => true,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        $adminId = DB::query()->from('admins')->insertGetId([
            'username' => $isRoot ? 'root-admin' : 'regular-admin',
            'email' => $isRoot ? 'root@example.test' : 'regular@example.test',
            'password' => bcrypt('password'),
            'persona_id' => $personaId,
            'root' => $isRoot,
            'estado' => true,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        /** @var Admin $admin */
        $admin = Admin::query()->select([
            'id',
            'username',
            'email',
            'password',
            'persona_id',
            'root',
            'estado',
            'created_at',
            'updated_at',
        ])->findOrFail($adminId);

        $plainTextToken = $admin->createToken('test-token', ['admin'])->plainTextToken;
        $tokenId = $admin->tokens()->latest('id')->value('id');
        $uuid = 'test-device-uuid';

        DB::query()->from('token_devices')->insert([
            'personal_access_token_id' => $tokenId,
            'uuid' => $uuid,
            'device_id' => $deviceId,
            'device_operative_system_id' => $osId,
            'browser_id' => $browserId,
            'created_at' => now(),
            'updated_at' => now(),
        ]);

        return [$admin, $plainTextToken, $uuid];
    }
}
