<?php

namespace App\Http\Controllers;

use App\Models\Cliente\Cliente;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;

class ReniecController extends Controller
{
    public function consultarDni(Request $request)
    {
        if (! $request->expectsJson()) {
            return response()->json([
                'success' => false,
                'message' => 'Solicitud inválida.',
            ], 400);
        }

        $validator = Validator::make($request->all(), [
            'dni' => ['required', 'digits:8'],
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'El DNI debe tener exactamente 8 dígitos numéricos.',
                'errors' => $validator->errors(),
            ], 422);
        }

        $dni = trim((string) $request->dni);

        $cliente = Cliente::where('dni', $dni)->first();

        if ($cliente) {
            return response()->json([
                'success' => true,
                'source' => 'clientes',
                'dni' => $cliente->dni,
                'nombres' => $cliente->nombres,
                'apellido_paterno' => $cliente->apellido_paterno,
                'apellido_materno' => $cliente->apellido_materno,
                'nombre_completo' => trim(
                    ($cliente->nombres) . ' ' .
                    ($cliente->apellido_paterno ) . ' ' .
                    ($cliente->apellido_materno )
                ),
                'message' => 'Datos encontrados en la tabla clientes.',
            ]);
        }

        $token = config('services.apis_net_pe.token');
        $url = config('services.apis_net_pe.base_url', 'https://api.apis.net.pe');

        if (empty($token)) {
            return response()->json([
                'success' => false,
                'message' => 'No existe token configurado para APIS.NET.PE.',
            ], 500);
        }

        try {
            $response = Http::withOptions([
                    'verify' => false,
                ])
                ->timeout(15)
                ->retry(1, 500)
                ->withToken($token)
                ->withHeaders([
                    'Referer' => 'https://apis.net.pe/consulta-dni-api',
                    'Accept' => 'application/json',
                ])
                ->get($url . '/v1/dni', [
                    'numero' => $dni,
                ]);

            if ($response->status() === 404) {
                return response()->json([
                    'success' => false,
                    'message' => 'No existe número de consulta.',
                ], 404);
            }

            if ($response->status() === 422) {
                return response()->json([
                    'success' => false,
                    'message' => 'El DNI debe tener exactamente 8 dígitos numéricos.',
                    'errors' => $response->json(),
                ], 422);
            }

            if (! $response->successful()) {
                return response()->json([
                    'success' => false,
                    'message' => 'No se pudo consultar RENIEC.',
                    'status' => $response->status(),
                    'body' => $response->body(),
                ], $response->status());
            }

            $data = $response->json();

            $nombres = $data['nombres'];
            $apellidoPaterno = $data['apellidoPaterno'];
            $apellidoMaterno = $data['apellidoMaterno'];

            $cliente = Cliente::create([
                'dni' => $dni,
                'nombres' => $nombres,
                'apellido_paterno' => $apellidoPaterno,
                'apellido_materno' => $apellidoMaterno,
                'estado' => 'AC',
            ]);

            return response()->json([
                'success' => true,
                'source' => 'reniec',
                'dni' => $cliente->dni,
                'nombres' => $cliente->nombres,
                'apellido_paterno' => $cliente->apellido_paterno,
                'apellido_materno' => $cliente->apellido_materno,
                'nombre_completo' => trim(
                    ($cliente->nombres) . ' ' .
                    ($cliente->apellido_paterno) . ' ' .
                    ($cliente->apellido_materno)
                ),
                'message' => 'Datos encontrados en RENIEC y guardados en clientes.',
            ]);
        } catch (\Throwable $e) {
            return response()->json([
                'success' => false,
                'message' => 'Error al consultar el servicio RENIEC.',
                'error' => $e->getMessage(),
            ], 500);
        }
    }
}