<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\HardwareInventario;
use App\Models\ItemRevisionMantenimiento;
use App\Models\MantChecklistRespuesta;
use App\Models\MantEstado;
use App\Models\MantProgramacion;
use App\Models\PeajeCentro;
use App\Models\Usuario;
use App\Models\ViaSubcentro;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class MantenimientoController extends Controller
{
    /**
     * Listado de mantenimientos con filtros
     */
    public function index(Request $request)
    {
        // Filtros
        $filtros = [
            'fecha_desde' => $request->get('fecha_desde', now()->startOfMonth()->format('Y-m-d')),
            'fecha_hasta' => $request->get('fecha_hasta', now()->endOfMonth()->format('Y-m-d')),
            'centro_id' => $request->get('centro_id'),
            'tecnico_id' => $request->get('tecnico_id'),
            'estado_id' => $request->get('estado_id'),
        ];

        $query = MantProgramacion::with(['centro.concesion', 'tecnico', 'estadoMantenimiento'])
            ->where('estado', 1)
            ->where(function ($q) use ($filtros) {
                $q->whereBetween('fecha_programada', [$filtros['fecha_desde'], $filtros['fecha_hasta']])
                  ->orWhereBetween('fecha_fin', [$filtros['fecha_desde'], $filtros['fecha_hasta']]);
            });

        if ($filtros['centro_id']) {
            $query->where('id_centro', $filtros['centro_id']);
        }
        if ($filtros['tecnico_id']) {
            $query->where('tecnico_asignado', $filtros['tecnico_id']);
        }
        if ($filtros['estado_id']) {
            $query->where('estado_id', $filtros['estado_id']);
        }

        $mantenimientos = $query->orderBy('fecha_programada', 'desc')
            ->paginate(15)
            ->withQueryString();

        // Estadísticas rápidas
        $estadisticas = [
            'total' => MantProgramacion::where('estado', 1)
                ->whereBetween('fecha_programada', [$filtros['fecha_desde'], $filtros['fecha_hasta']])
                ->count(),
            'completados' => MantProgramacion::where('estado', 1)
                ->whereBetween('fecha_programada', [$filtros['fecha_desde'], $filtros['fecha_hasta']])
                ->whereHas('estadoMantenimiento', fn($q) => $q->where('estado_codigo', 'COMPLETADO'))
                ->count(),
            'en_proceso' => MantProgramacion::where('estado', 1)
                ->whereBetween('fecha_programada', [$filtros['fecha_desde'], $filtros['fecha_hasta']])
                ->whereHas('estadoMantenimiento', fn($q) => $q->whereIn('estado_codigo', ['EN_MANTENIMIENTO', 'CAMINO_PEAJE', 'LLEGADA_PEAJE', 'MANT_FINALIZADO']))
                ->count(),
            'pendientes' => MantProgramacion::where('estado', 1)
                ->whereBetween('fecha_programada', [$filtros['fecha_desde'], $filtros['fecha_hasta']])
                ->whereHas('estadoMantenimiento', fn($q) => $q->where('estado_codigo', 'PROGRAMADO'))
                ->count(),
        ];

        // Datos para filtros
        $centros = PeajeCentro::where('estado', 1)->orderBy('nombre_centro')->get();
        $tecnicos = Usuario::whereHas('perfil', function ($q) {
            $q->whereHas('rol', function ($r) {
                $r->where('rol_codigo', 'TECNICOS');
            });
        })->where('usu_estado', 1)->orderBy('usu_nombre')->get();
        $estados = MantEstado::where('estado', 1)->orderBy('orden')->get();

        return view('modules.mantenimientos.index', compact(
            'mantenimientos',
            'filtros',
            'estadisticas',
            'centros',
            'tecnicos',
            'estados'
        ));
    }

    /**
     * Ver detalle del mantenimiento con progreso por vías y equipos
     */
    public function show(int $id)
    {
        $mantenimiento = MantProgramacion::with([
            'centro.concesion',
            'tecnico',
            'estadoMantenimiento',
            'historialEstados.estadoAnterior',
            'historialEstados.estadoNuevo',
            'historialEstados.tecnico',
           // 'historialEstados.usuarioEjecuta',
            'checklistRespuestas.itemRevision',
            'checklistRespuestas.estadoEquipo',
            'checklistRespuestas.inventario.tipoHardware',
            'checklistRespuestas.inventario.marca',
            'checklistRespuestas.via',
            'evidencias' => fn($q) => $q->where('estado', 1),
            'aprobacion.jefeOperativo',
        ])->where('prog_id', $id)->first();

        if (!$mantenimiento) {
            abort(404, 'Mantenimiento no encontrado');
        }

        // Obtener items de revisión
        $itemsRevision = ItemRevisionMantenimiento::where('estado', 1)
            ->orderBy('orden')
            ->get();

        // Obtener vías del peaje
        $vias = ViaSubcentro::where('id_centro', $mantenimiento->id_centro)
            ->where('estado', 1)
            ->orderBy('nombre')
            ->get();

        // Agrupar respuestas del checklist por vía y luego por equipo
        $respuestasPorVia = $mantenimiento->checklistRespuestas->groupBy('via_id');

        // Calcular progreso por vía
        $progresoVias = [];
        $totalItemsGeneral = 0;
        $totalRespondidosGeneral = 0;
        $totalEquipos = 0;

        foreach ($vias as $via) {
            $respuestasVia = $respuestasPorVia->get($via->via_id, collect());
            $respuestasPorEquipo = $respuestasVia->groupBy('inventario_id');

            $equiposConProgreso = [];
            $respondidosVia = 0;

            foreach ($respuestasPorEquipo as $inventarioId => $respuestasEquipo) {
                $equipo = $respuestasEquipo->first()->inventario;
                if (!$equipo) continue;

                $itemsRespondidos = $respuestasEquipo->count();
                $totalItems = $itemsRevision->count();
                $porcentaje = $totalItems > 0 ? round(($itemsRespondidos / $totalItems) * 100) : 0;
                $respondidosVia += $itemsRespondidos;

                // Estado general del equipo
                $estadoGeneral = 'pendiente';
                if ($porcentaje == 100) {
                    $tieneProblemas = $respuestasEquipo->contains(fn($r) =>
                        $r->estadoEquipo && !in_array($r->estadoEquipo->codigo, ['OPERATIVO', 'OK'])
                    );
                    $estadoGeneral = $tieneProblemas ? 'con_observaciones' : 'completado';
                } elseif ($porcentaje > 0) {
                    $estadoGeneral = 'en_progreso';
                }

                $equiposConProgreso[] = [
                    'equipo' => $equipo,
                    'respuestas' => $respuestasEquipo,
                    'items_respondidos' => $itemsRespondidos,
                    'total_items' => $totalItems,
                    'porcentaje' => $porcentaje,
                    'estado' => $estadoGeneral,
                ];

                $totalEquipos++;
            }

            $totalItemsVia = count($equiposConProgreso) * $itemsRevision->count();
            $porcentajeVia = $totalItemsVia > 0 ? round(($respondidosVia / $totalItemsVia) * 100) : 0;

            // Solo agregar la vía si tiene equipos revisados
            if (count($equiposConProgreso) > 0) {
                $progresoVias[] = [
                    'via' => $via,
                    'equipos' => $equiposConProgreso,
                    'total_equipos' => count($equiposConProgreso),
                    'items_respondidos' => $respondidosVia,
                    'total_items' => $totalItemsVia,
                    'porcentaje' => $porcentajeVia,
                ];

                $totalItemsGeneral += $totalItemsVia;
                $totalRespondidosGeneral += $respondidosVia;
            }
        }

        // Vías sin equipos revisados (para mostrar que faltan)
        $viasConEquipos = collect($progresoVias)->pluck('via.via_id')->toArray();
        $viasPendientes = $vias->filter(fn($v) => !in_array($v->via_id, $viasConEquipos));

        // Progreso general
        $progresoGeneral = [
            'total_vias' => $vias->count(),
            'vias_con_revision' => count($progresoVias),
            'total_equipos' => $totalEquipos,
            'total_items' => $totalItemsGeneral,
            'items_respondidos' => $totalRespondidosGeneral,
            'porcentaje' => $totalItemsGeneral > 0 ? round(($totalRespondidosGeneral / $totalItemsGeneral) * 100) : 0,
            'evidencias' => $mantenimiento->evidencias->count(),
            'evidencias_minimo' => 3,
        ];

        // Estados del equipo para referencia
        $estadosEquipo = DB::table('mant_estado_equipos')
            ->where('estado', 1)
            ->orderBy('estado_equipo_id')
            ->get();

        return view('modules.mantenimientos.show', compact(
            'mantenimiento',
            'itemsRevision',
            'progresoVias',
            'viasPendientes',
            'progresoGeneral',
            'estadosEquipo'
        ));
    }
}
