<?php

namespace App\Services;

use App\Models\Plate;
use App\Models\PlateDemo;
use App\Models\User;

class PlateService
{
    /**
     * Busca placas basándose en el tipo de usuario y el nivel
     *
     * @param string $keyword
     * @param User $user
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function search(string $keyword, User $user, int $limit = 50)
    {
        $keyword = strtoupper($keyword);
        $query = $user->isDemoUser() ? PlateDemo::query() : Plate::query();

        return $query->where('plate_enable', 1)
            ->where('plate_level', '>=', $user->level)
            ->where('plate_name', 'like', $keyword . '%')
            ->orderBy('plate_name')
            ->limit($limit)
            ->get();
    }

    /**
     * Anula una placa (Soft Delete lógico)
     *
     * @param int $id
     * @param User $user
     * @return bool
     */
    public function disablePlate(int $id, User $user)
    {
        $query = $user->isDemoUser() ? PlateDemo::query() : Plate::query();
        
        $updated = $query->where('id', $id)
            ->where('plate_enable', 1)
            ->update(['plate_enable' => 0]);

        return $updated > 0;
    }

    /**
     * Obtiene las últimas placas consultadas en RGM y las asocia con datos locales si existen
     *
     * @param User $user
     * @param int $limit
     * @return \Illuminate\Support\Collection
     */
    public function getRecentPlates(User $user, int $limit = 9)
    {
        $recentRgm = \App\Models\PlateRgmDetail::orderBy('last_scraped_at', 'desc')
            ->limit($limit)
            ->get();

        $plates = collect();

        if ($recentRgm->isEmpty()) {
            return $plates;
        }

        // Obtener todos los nombres de placas únicos e indexarlos en un solo query (Evita N+1 Queries)
        $plateNames = $recentRgm->pluck('plate_name')->unique()->toArray();
        $query = $user->isDemoUser() ? PlateDemo::query() : Plate::query();
        $localPlates = $query->whereIn('plate_name', $plateNames)
            ->get()
            ->keyBy('plate_name');

        foreach ($recentRgm as $rgm) {
            // Buscar en la colección cargada en memoria
            $localPlate = $localPlates->get($rgm->plate_name);

            if ($localPlate) {
                $plates->push($localPlate);
            } else {
                // Crear objeto anónimo compatible con la estructura de Plate para PlateResource
                $plates->push((object)[
                    'id' => -$rgm->id, // ID negativo para evitar conflictos con registros existentes
                    'plate_name' => $rgm->plate_name,
                    'plate_desc' => 'Vehículo - ' . ($rgm->tiene_restriccion ? 'Afectación RGM' : 'Libre de Gravámenes RGM'),
                    'plate_detail' => 'Marca: ' . ($rgm->marca ?? 'N/A') . ', Línea: ' . ($rgm->referencia ?? 'N/A'),
                    'plate_location' => $rgm->marca ? $rgm->marca . ' (' . ($rgm->referencia ?? 'S/R') . ')' : 'RGM Nacional',
                    'plate_level' => $user->level,
                    'plate_entry_date' => $rgm->last_scraped_at ? $rgm->last_scraped_at->toDateTimeString() : now()->toDateTimeString(),
                    'plate_exit_date' => null,
                    'plate_enable' => 1,
                ]);
            }
        }

        return $plates;
    }
}

