<?php

namespace App\Http\Controllers\Ajustador;

use App\Http\Controllers\Controller;
use App\Models\Caso;
use App\Models\User;
use App\Services\NotificationService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AjustadorCasoController extends Controller
{
    public function updateStatus(Request $request, Caso $caso)
    {
        $ajustador = Auth::guard('ajustador')->user();

        if ($caso->ajustador_id !== $ajustador->id) {
            return back()->withErrors(['error' => 'No tienes permiso para modificar este caso.']);
        }

        $request->validate([
            'estado' => 'required|string|in:caso_en_ruta,inspeccion_realizada,inspeccion_no_realizada,elaboracion_informe,envio_informe,analisis',
            'nota' => 'nullable|string|max:500',
        ]);

        $newEstado = $request->estado;

        if ($newEstado === 'inspeccion_no_realizada') {
            $newEstado = 'recoordinacion';
        }

        $extraUpdate = [];
        if ($request->estado === 'inspeccion_no_realizada') {
            $extraUpdate['ajustador_id'] = null;
        }

        $ultimoHistorico = $caso->estadosHistoricos()->orderBy('created_at', 'desc')->first();
        if ($ultimoHistorico) {
            $fechaSalida = now();
            $duracion = $ultimoHistorico->created_at->diffInMinutes($fechaSalida);
            $ultimoHistorico->update([
                'fecha_salida' => $fechaSalida,
                'duracion_minutas' => $duracion,
            ]);
        }

        $caso->update(array_merge(['estado_actual' => $newEstado], $extraUpdate));

        $caso->estadosHistoricos()->create([
            'estado' => $newEstado,
            'nota' => $request->nota,
            'usuario_id' => $ajustador->id,
            'fecha_ingreso' => now(),
        ]);

        NotificationService::notify($caso, 'estado_actualizado', "Ajustador actualizó estado a '{$newEstado}'".($request->nota ? ": {$request->nota}" : ''));

        return back()->with('message', 'Estado actualizado correctamente');
    }

    public function uploadFiles(Request $request, Caso $caso)
    {
        $ajustador = Auth::guard('ajustador')->user();

        if ($caso->ajustador_id !== $ajustador->id) {
            return back()->withErrors(['error' => 'No tienes permiso para modificar este caso.']);
        }

        $request->validate([
            'files' => 'required|array',
            'files.*' => 'file|mimes:jpg,jpeg,png,pdf,gif,webp|max:20480',
            'descripciones' => 'nullable|array',
            'descripciones.*' => 'nullable|string|max:500',
        ]);

        $newFiles = [];
        foreach ($request->file('files') as $i => $file) {
            $path = $file->store('avisos', 'public');
            $newFiles[] = [
                'path' => $path,
                'nombre' => $file->getClientOriginalName(),
                'descripcion' => ($request->input('descripciones')[$i] ?? '') ?: '',
                'uploaded_by' => 'ajustador',
                'uploaded_at' => now()->toDateTimeString(),
            ];
        }

        $existingFiles = $this->normalizarArchivos($caso->ajustador_archivos);
        $caso->update([
            'ajustador_archivos' => array_merge($existingFiles, $newFiles),
        ]);

        // Notificar al admin
        $admin = User::where('rol', 'admin')->first();
        if ($admin) {
            NotificationService::notify(
                $caso,
                'archivos_subidos',
                "El ajustador {$ajustador->nombre} subió ".count($newFiles)." archivo(s) al caso {$caso->numero_reclamo}",
                ['ajustador_id' => $ajustador->id, 'cantidad' => count($newFiles)]
            );
        }

        return back()->with('message', count($newFiles).' archivo(s) subido(s) correctamente');
    }

    public function deleteFile(Caso $caso, int $index)
    {
        $ajustador = Auth::guard('ajustador')->user();

        if ($caso->ajustador_id !== $ajustador->id) {
            return back()->withErrors(['error' => 'No tienes permiso para modificar este caso.']);
        }

        $archivos = $this->normalizarArchivos($caso->ajustador_archivos);
        $nombreArchivo = isset($archivos[$index]) ? ($archivos[$index]['nombre'] ?? 'Archivo') : 'Archivo';
        if (isset($archivos[$index])) {
            unset($archivos[$index]);
            $caso->update(['ajustador_archivos' => array_values($archivos)]);
        }

        $admin = User::where('rol', 'admin')->first();
        if ($admin) {
            NotificationService::notify(
                $caso,
                'archivo_eliminado',
                "El ajustador {$ajustador->nombre} eliminó un archivo ({$nombreArchivo}) del caso {$caso->numero_reclamo}",
                ['ajustador_id' => $ajustador->id, 'archivo' => $nombreArchivo]
            );
        }

        return back()->with('message', 'Archivo eliminado correctamente');
    }

    public function confirmarLlegada(Caso $caso)
    {
        $ajustador = Auth::guard('ajustador')->user();

        if ($caso->ajustador_id !== $ajustador->id) {
            return back()->withErrors(['error' => 'No tienes permiso para modificar este caso.']);
        }

        $caso->update([
            'confirmo_llegada' => true,
            'confirmo_llegada_at' => now(),
        ]);

        $caso->estadosHistoricos()->create([
            'estado' => $caso->estado_actual,
            'nota' => 'Ajustador confirmó llegada al lugar de la inspección',
            'usuario_id' => $ajustador->id,
            'fecha_ingreso' => now(),
        ]);

        NotificationService::notify($caso, 'llegada_confirmada', "Ajustador {$ajustador->nombre} confirmó llegada al lugar de inspección del caso {$caso->numero_reclamo}");

        return back()->with('message', 'Llegada confirmada correctamente');
    }

    public function enviarInforme(Request $request, Caso $caso)
    {
        $ajustador = Auth::guard('ajustador')->user();

        if ($caso->ajustador_id !== $ajustador->id) {
            return back()->withErrors(['error' => 'No tienes permiso para modificar este caso.']);
        }

        $validated = $request->validate([
            'tipo_inspeccion' => 'nullable|string|max:50',
            'fecha_inspeccion' => 'nullable|date',
            'lugar_inspeccion' => 'nullable|string|max:255',
            'danos_externos' => 'nullable|string',
            'danos_internos' => 'nullable|string',
            'danos_mecanicos' => 'nullable|string',
            'danos_electricos' => 'nullable|string',
            'clasificacion_dano' => 'nullable|string|max:50',
            'costo_estimado_reparacion' => 'nullable|numeric|min:0',
            'tiempo_estimato_reparacion_dias' => 'nullable|integer|min:0',
            'observaciones_tecnicas' => 'nullable|string',
            'conclusion_recomendacion' => 'nullable|string',
            'piezas_reemplazar' => 'nullable|array',
            'piezas_reemplazar.*.nombre' => 'nullable|string|max:255',
            'piezas_reemplazar.*.codigo' => 'nullable|string|max:100',
            'piezas_reemplazar.*.cantidad' => 'nullable|integer|min:1',
            'piezas_reemplazar.*.costo_unitario' => 'nullable|numeric|min:0',
        ]);

        $informeData = [
            'tipo_inspeccion' => $validated['tipo_inspeccion'] ?? null,
            'fecha_inspeccion' => $validated['fecha_inspeccion'] ?? null,
            'lugar_inspeccion' => $validated['lugar_inspeccion'] ?? null,
            'danos_externos' => $validated['danos_externos'] ?? null,
            'danos_internos' => $validated['danos_internos'] ?? null,
            'danos_mecanicos' => $validated['danos_mecanicos'] ?? null,
            'danos_electricos' => $validated['danos_electricos'] ?? null,
            'clasificacion_dano' => $validated['clasificacion_dano'] ?? null,
            'costo_estimado_reparacion' => $validated['costo_estimado_reparacion'] ?? null,
            'tiempo_estimato_reparacion_dias' => $validated['tiempo_estimato_reparacion_dias'] ?? null,
            'observaciones_tecnicas' => $validated['observaciones_tecnicas'] ?? null,
            'conclusion_recomendacion' => $validated['conclusion_recomendacion'] ?? null,
            'piezas_reemplazar' => $validated['piezas_reemplazar'] ?? [],
            'enviado_por' => $ajustador->id,
            'enviado_por_nombre' => $ajustador->nombre,
            'enviado_at' => now()->toDateTimeString(),
        ];

        $caso->update([
            'informe_data' => $informeData,
            'informe_enviado' => true,
            'informe_enviado_at' => now(),
            'estado_actual' => 'envio_informe',
        ]);

        $caso->estadosHistoricos()->create([
            'estado' => 'envio_informe',
            'nota' => 'Informe de análisis enviado por el ajustador',
            'usuario_id' => $ajustador->id,
            'fecha_ingreso' => now(),
        ]);

        $admin = User::where('rol', 'admin')->first();
        if ($admin) {
            NotificationService::notify(
                $caso,
                'informe_enviado',
                "El ajustador {$ajustador->nombre} envió el informe de análisis del caso {$caso->numero_reclamo}",
                ['ajustador_id' => $ajustador->id]
            );
        }

        return back()->with('message', 'Informe enviado correctamente');
    }

    private function normalizarArchivos($valor): array
    {
        if (is_array($valor)) {
            return $valor;
        }
        if (is_string($valor)) {
            $decoded = json_decode($valor, true);

            return is_array($decoded) ? $decoded : [];
        }

        return [];
    }
}
