<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\Uuid;
use Illuminate\Support\Facades\Log;
use App\Helpers\UuidEncryptionHelper;

class AuthController extends Controller
{
    /**
     * Login y generación de Bearer Token
     */
    public function login(Request $request)
    {
        $request->validate([
            'username' => 'required|string',
            'password' => 'required|string',
            'uuid' => 'required|string',
        ]);

        $user = User::where('username', $request->username)->where('user_status', 1)->first();

        if (!$user || !Hash::check($request->password, $user->password)) {
            return response()->json(['success' => false, 'error' => 'Usuario o Contraseña Incorrectos'], 401);
        }

        // Verificación de Modo App Store Review para usuarios Demo
        if ($user->isDemoUser() && !env('APP_STORE_REVIEW_MODE', false)) {
            return response()->json(['success' => false, 'error' => 'El acceso de cuentas de prueba está deshabilitado.'], 403);
        }

        $inputUuid = $request->input('uuid');
        $decryptedUuid = UuidEncryptionHelper::decrypt($inputUuid);

        // 1. Exclusión de verificación UUID únicamente para Super Admin (rol 0)
        //    El Super Admin es el único perfil de desarrollador libre de restricción de UUID.
        if ($user->role === 0) {
            $user->online_status = 1;
            $user->last_connection = now();
            $user->save();

            // Generar Token
            $token = $user->createToken('auth_token')->plainTextToken;

            return response()->json([
                'success' => true, 
                'data' => [
                    'user' => $user,
                    'access_token' => $token,
                    'token_type' => 'Bearer'
                ]
            ]);
        }

        // 2. Validación de UUID para Agentes y otros roles
        $uuid_check = Uuid::where('user_id', $user->id)
            ->where('uuid', $decryptedUuid)
            ->where('status', 1)
            ->first();

        if ($uuid_check) {
            // Dispositivo autorizado
            $user->online_status = 1;
            $user->last_connection = now();
            $user->save();

            // Generar Token
            $token = $user->createToken('auth_token')->plainTextToken;

            return response()->json([
                'success' => true, 
                'data' => [
                    'user' => $user,
                    'access_token' => $token,
                    'token_type' => 'Bearer'
                ]
            ]);
        } else {
            // Dispositivo no autorizado (retornamos el UUID encriptado para que se genere el QR en el cliente)
            return response()->json([
                'success' => false,
                'error' => 'Dispositivo no autorizado',
                'uuid' => $inputUuid,
                'unauthorized' => true
            ], 403);
        }
    }

    /**
     * Endpoint para registrar dispositivo (Reemplazo de insert_uuid.php)
     */
    public function registerDevice(Request $request)
    {
        $request->validate([
            'user' => 'required|string',
            'uuid' => 'required|string',
        ]);

        $email = $request->input('user');
        $uuid = UuidEncryptionHelper::decrypt($request->input('uuid'));

        $user = User::where('username', $email)->first();

        if (!$user) {
            return response()->json(['success' => false, 'error' => 'No se encontró un usuario con ese username/email'], 404);
        }

        try {
            $uuidRecord = Uuid::where('user_id', $user->id)->first();

            if ($uuidRecord) {
                $uuidRecord->uuid = $uuid;
                $uuidRecord->status = 1;
                $uuidRecord->save();
                $message = "UUID actualizado con éxito";
            } else {
                Uuid::create([
                    'user_id' => $user->id,
                    'uuid' => $uuid,
                    'status' => 1
                ]);
                $message = "Dato insertado con éxito";
            }

            return response()->json(['success' => true, 'message' => $message]);
        } catch (\Exception $e) {
            Log::error('Error registrando dispositivo: ' . $e->getMessage());
            return response()->json(['success' => false, 'error' => 'Error en el servidor al registrar el dispositivo'], 500);
        }
    }

    /**
     * Logout y revocación de Token
     */
    public function logout(Request $request)
    {
        $user = $request->user();
        if ($user) {
            $user->online_status = 0;
            $user->save();
            $user->currentAccessToken()->delete();
        }

        return response()->json(['success' => true, 'message' => 'Sesión cerrada correctamente']);
    }

    /**
     * Obtener el usuario autenticado
     */
    public function me(Request $request)
    {
        return response()->json([
            'success' => true,
            'data' => $request->user()
        ]);
    }
}