<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Services\PlateService;
use App\Http\Resources\PlateResource;
use Illuminate\Support\Facades\Log;

class PlateController extends Controller
{
    protected $plateService;
    protected $rgmService;

    public function __construct(PlateService $plateService, \App\Services\RgmService $rgmService)
    {
        $this->plateService = $plateService;
        $this->rgmService = $rgmService;
    }

    /**
     * Busca placas basado en un término (prefijo)
     */
    public function search(Request $request)
    {
        $request->validate([
            'q' => 'required|string|min:3|max:7',
        ], [
            'q.min' => 'El término de búsqueda debe tener al menos 3 caracteres.',
            'q.max' => 'El término de búsqueda no debe superar los 7 caracteres.',
        ]);

        $keyword = $request->input('q');
        $user = $request->user();


        $plates = $this->plateService->search($keyword, $user);

        return PlateResource::collection($plates);
    }

    /**
     * Obtiene las placas consultadas recientemente en RGM
     */
    public function recent(Request $request)
    {
        $user = $request->user();
        $plates = $this->plateService->getRecentPlates($user);

        return PlateResource::collection($plates);
    }


    /**
     * Consulta información de Garantías Mobiliarias para una placa
     */
    public function garantias(Request $request, $plate_name)
    {
        try {
            $data = $this->rgmService->getGarantias($plate_name);
            
            // Ocultar campos sensibles a absolutamente todos los roles
            unset($data['monto']);
            unset($data['fecha_inscripcion']);

            // Si el usuario no es admin/superadmin (roles 0 y 1), ocultar acreedor y deudor
            $role = (int)$request->user()->role;
            if ($role > 1) {
                unset($data['acreedor']);
                unset($data['deudor']);
            }

            return response()->json([
                'success' => true,
                'data' => $data
            ]);
        } catch (\Exception $e) {
            $errorMsg = $e->getMessage();
            Log::error("Error consultando Garantías Mobiliarias en RGM (Placa: {$plate_name}): " . $errorMsg);
            
            // Mensaje amigable por defecto
            $friendlyMessage = 'Ocurrió un error inesperado al consultar la placa. Por favor, intenta nuevamente.';

            // Mapeo de errores técnicos a mensajes de usuario (UX)
            if (stripos($errorMsg, 'cURL') !== false || stripos($errorMsg, 'conexión') !== false || stripos($errorMsg, 'timeout') !== false) {
                $friendlyMessage = 'No se pudo establecer conexión con el Registro de Garantías Mobiliarias (RGM). El servidor remoto podría estar saturado o inactivo. Intenta de nuevo más tarde.';
            } elseif (stripos($errorMsg, 'HTTP') !== false || stripos($errorMsg, 'bloqueó') !== false) {
                $friendlyMessage = 'El portal de RGM rechazó la consulta temporalmente por alto tráfico o bloqueos de seguridad. Por favor, espera unos minutos e intenta de nuevo.';
            } elseif (stripos($errorMsg, 'análisis') !== false || stripos($errorMsg, 'extracción') !== false || stripos($errorMsg, 'VIEWSTATE') !== false) {
                $friendlyMessage = 'El sistema de RGM no respondió con el formato esperado o se encuentra en mantenimiento. Nuestro equipo técnico ha sido notificado.';
            } elseif (stripos($errorMsg, 'ASP.NET') !== false) {
                $friendlyMessage = 'El servidor de RGM experimentó un error interno al procesar tu solicitud. Intenta nuevamente en unos momentos.';
            }

            return response()->json([
                'success' => false,
                'error' => $friendlyMessage
            ], 500);
        }
    }

    /**
     * Enviar notificación de consulta de oficio por Telegram
     */
    public function telegramNotify(Request $request)
    {
        $request->validate([
            'plate_name' => 'required|string',
        ]);

        $user = $request->user();
        $plateName = $request->plate_name;
        
        $settings = \App\Models\Setting::whereIn('key', ['telegram_bot_token', 'telegram_chat_id'])->pluck('value', 'key');
        
        $token = $settings->get('telegram_bot_token');
        $chatId = $settings->get('telegram_chat_id');

        if (!$token || !$chatId) {
            return response()->json(['success' => false, 'error' => 'Configuración de Telegram incompleta'], 500);
        }

        $date = now()->timezone('America/Bogota')->format('Y-m-d H:i:s');
        $message = "🚨 *Consulta de Oficio*\n👤 *Usuario:* {$user->name} ({$user->username})\n🚗 *Placa:* {$plateName}\n🕒 *Fecha:* {$date}";

        try {
            \Illuminate\Support\Facades\Http::post("https://api.telegram.org/bot{$token}/sendMessage", [
                'chat_id' => $chatId,
                'text' => $message,
                'parse_mode' => 'Markdown'
            ]);

            return response()->json(['success' => true]);
        } catch (\Exception $e) {
            \Illuminate\Support\Facades\Log::error("Error enviando Telegram: " . $e->getMessage());
            return response()->json(['success' => false, 'error' => 'Error al enviar notificación'], 500);
        }
    }

    /**
     * Deshabilita una placa
     */
    public function destroy(Request $request, $id)
    {
        $user = $request->user();
        
        $success = $this->plateService->disablePlate($id, $user);

        if ($success) {
            return response()->json(['success' => true, 'message' => 'Placa anulada correctamente']);
        }

        return response()->json(['success' => false, 'error' => 'No se encontró la placa o ya estaba inactiva'], 404);
    }
}
