<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use App\Http\Requests\StoreEstadisticaRequest;

use App\Http\Requests\StoreFormularioRequest;
use App\Models\Formulario;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;

// app/Http/Controllers/FormularioController.php
use App\Models\Prestador;
use App\Models\Sede;
use App\Models\Departamento;
use App\Models\Municipio;

// app/Http/Controllers/FormularioController.php
use Carbon\Carbon;
use Illuminate\Support\Str;



class FormularioController extends Controller
{


    // FormularioController.php
    public function create()
    {
        $seleccion = session('seleccion_sede');
        $prefill = null;

        if ($seleccion) {
            $depId = trim($seleccion['departamento_id'] ?? '');
            $munId = trim($seleccion['municipio_id'] ?? '');
            $nit = trim($seleccion['nit'] ?? '');
            // Periodo evaluado: avanzar un tramo respecto al que llega de la base
            $periodoBase = trim($seleccion['trimestre'] ?? '');
            $mapNext = [
                'I' => 'I-II',
                'I-II' => 'I-II-III',
                'I-II-III' => 'I-II-III-IV',
                'I-II-III-IV' => 'I-II-III-IV',
            ];
            $periodo = $mapNext[$periodoBase] ?? $periodoBase;

            // Busca por clave STRING (sin find() para evitar cast)
            $dep = $depId ? Departamento::whereRaw('LTRIM(RTRIM(id_departamento)) = ?', [$depId])->first() : null;
            $mun = $munId ? Municipio::whereRaw('LTRIM(RTRIM(id_municipio)) = ?', [$munId])->first() : null;

            // Prestador por NIT (string)
            $prest = Prestador::whereRaw('LTRIM(RTRIM(nit)) = ?', [$nit])->first();

            $fechaInicio = $this->parseDateNormalized($prest?->fecha_inicio);
            $fechaFinal = $this->parseDateNormalized($prest?->fecha_final);
            $fechaFirma = $this->parseDateNormalized($prest?->fecha_firma_contrato);

            $prefill = [
                'modalidad' => 'CAPITA',
                'numero_contrato' => $prest?->numero_contrato,
                'nit' => $nit,
                'prestador' => $seleccion['prestador'] ?? null,
                'tipo_red' => $seleccion['tipo_red'] ?? null,
                'complejidad' => $seleccion['complejidad'] ?? null,
                'fecha_inicio' => $fechaInicio ? $fechaInicio->toDateString() : ($prest?->fecha_inicio ?? null),
                'fecha_inicio_norm' => optional($fechaInicio)->toDateString(),
                'fecha_final' => $fechaFinal ? $fechaFinal->toDateString() : ($prest?->fecha_final ?? null),
                'fecha_final_norm' => optional($fechaFinal)->toDateString(),
                'fecha_firma_contrato' => $fechaFirma ? $fechaFirma->toDateString() : ($prest?->fecha_firma_contrato ?? null),
                'fecha_firma_contrato_norm' => optional($fechaFirma)->toDateString(),
                'departamento' => $dep?->departamento ?? ($seleccion['departamento'] ?? null),
                'municipio' => $mun?->municipio ?? ($seleccion['municipio'] ?? null),
                'departamento_id' => $dep?->id_departamento ?? $depId,
                'municipio_id' => $mun?->id_municipio ?? $munId,
                'objeto' => 'Prestación de servicios de servicios y tecnologías en salud para la atención integral de la población afiliada al FOMAG, En lo correspondiente al nivel primario y a los grupos de población por curso de vida. ',
                'contratante' => ' FIDUPREVISORA como vocera y administradora del Fondo Nacional de Prestaciones Sociales del Magisterio - FOMAG',
            ];

            $ejecucion = [
                'prestador' => $seleccion['prestador'] ?? null,
                'departamento' => $dep?->departamento ?? ($seleccion['departamento'] ?? null),
                'municipio' => $mun?->municipio ?? ($seleccion['municipio'] ?? null),
                'periodo' => $periodo, // ← aquí viene el valor maestro
                'tipo_red' => $seleccion['tipo_red'] ?? null,
            ];
        }

        $dispoPlantilla = [
            ['item' => 'El prestador presenta  soporte de la suficiencia para la prestación de los servicios contratados a partir de la capacidad instalada, frente a las condiciones demográficas y epidemiológicas de la población del contratante que va ser atendida', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
            ['item' => 'La IPS tiene estrategias para  atención preferencial a menores de 5 años, gestantes, adultos mayores y personas en condición de discapacidad; al igual que garantizará la atención con enfoque diferencial y psicosocial a todas las víctimas del conflicto armado interno, pueblos indígenas, comunidades afrocolombianas, Palenqueros, Raizales, ROM y población LGBTIQ+', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
            ['item' => 'Resultados de la última evaluación de calidad >= 90%', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
            ['item' => 'Resultados de Rutas de Atención Integral en Salud >= 90%', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
            ['item' => 'Durante el periodo evaluado no ha presentado auditoría de alertas críticas', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
            ['item' => 'El prestador dispone de pólizas conforme lo pactado contractualmente', 'ponderado' => '3,3', 'cumple' => '', 'observaciones' => ''],
        ];

        if (($seleccion['tipo_red'] ?? null) === 'COMPLEMENTARIOS') {
            unset($dispoPlantilla[3]); // remove item 4
            $dispoPlantilla = array_values($dispoPlantilla);
            foreach ($dispoPlantilla as &$row) {
                $row['ponderado'] = '4';
            }
            unset($row);
        }




        return view('formularios.create', compact('seleccion', 'prefill', 'dispoPlantilla', 'ejecucion'));
    }







    public function store(StoreFormularioRequest $request)
    {
        $data = $request->validated();
        $sel = session('seleccion_sede');

        // Guarda la imagen en storage/app/public/servicios (asegúrate del storage:link)
        // --- Servicios contratados (múltiples soportes) ---
        $servFiles = $request->file('servicios.imagen');
        $servicios = [ 'descripcion' => $data['servicios']['descripcion'] ?? null ];
        if ($servFiles) {
            $files = is_array($servFiles) ? $servFiles : [$servFiles];
            $paths = [];
            $urls  = [];
            foreach ($files as $f) {
                if (!$f) continue;
                $p = $f->store('servicios', 'public');
                $paths[] = $p;
                $urls[]  = asset('storage/' . $p);
            }
            if ($paths) {
                $servicios['imagen_path']     = $paths[0];
                $servicios['imagen_url']      = $urls[0];
                $servicios['imagenes_paths']  = $paths;
                $servicios['imagenes_urls']   = $urls;
            }
        }

        // --- Registro especial de prestadores de salud (múltiples) ---
        $regFiles = $request->file('registro_especial.imagen');
        $registroEspecial = [ 'descripcion' => $data['registro_especial']['descripcion'] ?? null ];
        if ($regFiles) {
            $files = is_array($regFiles) ? $regFiles : [$regFiles];
            $paths = [];
            $urls  = [];
            foreach ($files as $f) {
                if (!$f) continue;
                $p = $f->store('registro_especial', 'public');
                $paths[] = $p;
                $urls[]  = asset('storage/' . $p);
            }
            if ($paths) {
                $registroEspecial['imagen_path']     = $paths[0];
                $registroEspecial['imagen_url']      = $urls[0];
                $registroEspecial['imagenes_paths']  = $paths;
                $registroEspecial['imagenes_urls']   = $urls;
            }
        }



        // Normaliza disposiciones (ponderado opcional; no se muestra)
        $items = collect($data['disposiciones']['items'] ?? [])->map(function ($r) {
            $pond = isset($r['ponderado']) ? (float) str_replace(',', '.', (string) $r['ponderado']) : null;
            return [
                'item' => (string) ($r['item'] ?? ''),
                'ponderado' => $pond,                   // o déjalo fuera si no lo usarás
                'cumple' => strtoupper((string) ($r['cumple'] ?? '')),
                'observaciones' => (string) ($r['observaciones'] ?? ''),
            ];
        })->values()->all();

        // Releer BD para valores de confianza
        $prest = $sel ? Prestador::where('nit', $sel['nit'])->first() : null;
        $dep = $sel ? Departamento::find($sel['departamento_id']) : null;
        $mun = $sel ? Municipio::find($sel['municipio_id']) : null;

        $fi = $this->parseDateNormalized($prest?->fecha_inicio);
        $ff = $this->parseDateNormalized($prest?->fecha_final);
        $fechaFirmaContrato = $this->parseDateNormalized($prest?->fecha_firma_contrato);

        // Duración en meses (aprox): diferencia de meses calendario (incluyente si aplica)
        $duracion_meses = ($fi && $ff) ? $fi->diffInMonths($ff) + 1 : null;

        $poblacion = (int) ($data['basicos']['poblacion_inicial'] ?? 0);
        $percapita = (float) ($data['basicos']['valor_per_capita'] ?? 0);
        $valor_total_mes = $poblacion * $percapita;

        $basicos = array_merge($data['basicos'] ?? [], [
            // Fijos/BD
            'modalidad' => 'CAPITA',
            'numero_contrato' => $prest?->numero_contrato,
            'nit' => $sel['nit'] ?? null,
            'prestador' => $sel['prestador'] ?? null,
            'fecha_inicio' => optional($fi)->toDateString(),
            'fecha_final' => optional($ff)->toDateString(),
            'duracion_contrato' => $duracion_meses, // meses
            'nivel_complejidad' => $sel['tipo_red'] ?? null,
            'nivel_atencion' => $sel['complejidad'] ?? null,
            'departamento' => $dep?->departamento,
            'municipio' => $mun?->municipio,
            'contratante' => 'Objeto contrato',
            'poblacion_inicial' => $poblacion,
            'valor_per_capita' => $percapita,
            'valor_total_mes' => $valor_total_mes,
            'numero_informe' => $data['basicos']['numero_informe'] ?? null,
            'novedad_contractual' => $data['basicos']['novedad_contractual'] ?? null,
            'fecha_firma_contrato' => optional($fechaFirmaContrato)->toDateString(),
            'anexos_disponibles' => $data['basicos']['anexos_disponibles'] ?? null,
        ]);

        // Armar payload de ejecución (incluye checklist y totales calculados)
        $ejecucionPayload = $request->input('ejecucion', []);
        // Adjunta checklist verificación sección 3
        $ejecucionPayload['verificacion3'] = $request->input('verificacion3', []);
        // Adjunta solo sombras/totales de la matriz para evitar archivos en JSON
        $matriz = $request->input('matriz', []);
        $ejecucionPayload['matriz'] = [
            '_sum_ajustes_I' => $matriz['_sum_ajustes_I'] ?? null,
            '_sum_ajustes_II' => $matriz['_sum_ajustes_II'] ?? null,
            '_sum_ajustes_III' => $matriz['_sum_ajustes_III'] ?? null,
            '_sum_ajustes_IV' => $matriz['_sum_ajustes_IV'] ?? null,
            '_sum_ajustes_total' => $matriz['_sum_ajustes_total'] ?? null,
            '_pct_I' => $matriz['_pct_I'] ?? null,
            '_pct_II' => $matriz['_pct_II'] ?? null,
            '_pct_III' => $matriz['_pct_III'] ?? null,
            '_pct_IV' => $matriz['_pct_IV'] ?? null,
            '_pct_total' => $matriz['_pct_total'] ?? null,
            // Nota: si deseas persistir filas completas, agrega aquí un resumen limpio.
        ];

        $indicadoresPayload = [
            'general' => $request->input('indicadores', []),
            'acceso' => $request->input('indicadores_acceso', []),
            'deteccion' => $request->input('indicadores_deteccion', []),
            'precursoras' => $request->input('indicadores_precursoras', []),
        ];

        $resultadosSalud = $request->input('resultados_salud', []);

        $nit = trim($sel['nit'] ?? $request->input('nit', ''));
        $municipioCodigo = trim($sel['municipio_id'] ?? $request->input('sede', ''));
        $anio = (int) ($request->input('anio_vigencia') ?? now()->year);
        $periodoLabel = $request->input('trimestre_eval') ?? ($basicos['periodo_evaluado'] ?? data_get($ejecucionPayload, 'periodo'));
        $periodoMap = ['I' => 1, 'I-II' => 2, 'I-II-III' => 3, 'I-II-III-IV' => 4];
        $periodoValue = $periodoMap[$periodoLabel] ?? null;

        $payload = [
            'nit' => $nit ?: null,
            'municipio' => $municipioCodigo ?: null,
            'anio' => $anio ?: null,
            'periodo' => $periodoValue,
            // Estado inicial: por socializar (pendiente de revisión)
            'estado' => 'por socializar',
            'creado_por' => optional($request->user())->name,
            'basicos' => $basicos,
            'disposiciones' => ['items' => $items],
            'servicios' => $servicios,
            'registro_especial' => $registroEspecial,
            'ejecucion' => $ejecucionPayload,
            'matriz' => $matriz,
            'indicadores' => $indicadoresPayload,
            'resultados_salud' => $resultadosSalud,
        ];

        $key = [
            'nit' => $payload['nit'],
            'municipio' => $payload['municipio'],
            'anio' => $payload['anio'],
            'periodo' => $payload['periodo'],
        ];

        if (!empty($key['nit']) && !empty($key['municipio'])) {
            $form = Formulario::updateOrCreate($key, $payload);
        } else {
            $form = Formulario::create($payload);
        }




        return redirect()->route('home')
            ->with('status', "Formulario {$form->id} guardado correctamente. Quedó en estado: por socializar.");
    }

    public function show(Formulario $formulario)
    {
        // Solo muestra la revisión; no cambia el estado automáticamente.
        return view('formularios.show', compact('formulario'));
    }

    // Carga de firmas y finalización de revisión
    public function finalizarRevision(Request $request, Formulario $formulario)
    {
        $validated = $request->validate([
            'firma_auditor' => 'required|image|mimes:jpg,jpeg,png,webp|max:4096',
            'firma_prestador' => 'required|image|mimes:jpg,jpeg,png,webp|max:4096',
        ]);

        $ejecucion = $formulario->ejecucion ?? [];
        $firmas = data_get($ejecucion, 'firmas', []);

        if ($request->hasFile('firma_auditor')) {
            $p = $request->file('firma_auditor')->store('firmas', 'public');
            $firmas['auditor'] = Storage::url($p);
        }

        if ($request->hasFile('firma_prestador')) {
            $p = $request->file('firma_prestador')->store('firmas', 'public');
            $firmas['prestador'] = Storage::url($p);
        }

        $ejecucion['firmas'] = $firmas;
        $formulario->ejecucion = $ejecucion;
        $formulario->estado = 'finalizado';
        $formulario->save();

        return redirect()->route('formularios.revision', $formulario)
            ->with('status', "Revisión finalizada. Firmas registradas y estado cambiado a finalizado.");
    }


    private function parseDateNormalized($value): ?Carbon
    {
        if ($value instanceof CarbonInterface) {
            return $value->copy();
        }

        if ($value instanceof \DateTimeInterface) {
            return Carbon::instance($value);
        }

        $value = is_string($value) ? trim($value) : (string) $value;
        if ($value === '' || $value === null) {
            return null;
        }

        $formats = ['d/m/Y', 'd-m-Y', 'Y-m-d', 'Y/m/d', 'm/d/Y'];
        foreach ($formats as $format) {
            try {
                return Carbon::createFromFormat($format, $value);
            } catch (\Throwable $e) {
                // Intentar siguiente formato
            }
        }

        try {
            return Carbon::parse($value);
        } catch (\Throwable $e) {
            return null;
        }
    }

public function pdf(Request $request)
    {
        // ⚠️ Si quieres, puedes validar de forma laxa aquí (p.ej. required en lo básico).
        // $validated = $request->validate([ ... ]);

        // Tomamos los bloques tal como llegan del formulario (ya los nombraste así):
        $basicos = $request->input('basicos', []);
        $disposiciones = $request->input('disposiciones', []);
        $ejecucion = $request->input('ejecucion', []);
        $matriz = $request->input('matriz', []);
        $verificacion3 = $request->input('verificacion3', []);
        $indicadoresAcceso = $request->input('indicadores_acceso', []);
        $indicadoresDeteccion = $request->input('indicadores_deteccion', []);
        $indicadoresPrecursoras = $request->input('indicadores_precursoras', []);
        $indicadoresBloque = $request->input('indicadores', []);

        // Imagen del bloque de indicadores (SISPRO) como data URL (base64)
        $indicadoresImgDataUrl = null;
        if ($request->hasFile('indicadores.imagen')) {
            $file = $request->file('indicadores.imagen');
            $first = is_array($file) ? ($file[0] ?? null) : $file;
            if ($first && $first->isValid()) {
                $mime = $first->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($first->getRealPath()));
                $indicadoresImgDataUrl = "data:$mime;base64,$data";
            }
        }
        $resultadosSalud = $request->input('resultados_salud', []);

        // Bloques con imagen y descripción: Servicios contratados y Registro especial
        $serviciosBloque = [
            'descripcion' => $request->input('servicios.descripcion')
        ];
        if ($request->hasFile('servicios.imagen')) {
            $fs = $request->file('servicios.imagen');
            $f = is_array($fs) ? ($fs[0] ?? null) : $fs;
            if ($f && $f->isValid()) {
                $mime = $f->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($f->getRealPath()));
                $serviciosBloque['imgDataUrl'] = "data:$mime;base64,$data";
            }
        }

        $registroEspecialBloque = [
            'descripcion' => $request->input('registro_especial.descripcion')
        ];
        if ($request->hasFile('registro_especial.imagen')) {
            $fs = $request->file('registro_especial.imagen');
            $f = is_array($fs) ? ($fs[0] ?? null) : $fs;
            if ($f && $f->isValid()) {
                $mime = $f->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($f->getRealPath()));
                $registroEspecialBloque['imgDataUrl'] = "data:$mime;base64,$data";
            }
        }

        // “Cabecero” útil para el reporte (prestador/depto/mun/periodo)
        $seleccion = [
            'prestador' => $ejecucion['prestador'] ?? ($basicos['prestador'] ?? null),
            'departamento' => $ejecucion['departamento'] ?? ($basicos['departamento'] ?? null),
            'municipio' => $ejecucion['municipio'] ?? ($basicos['municipio'] ?? null),
            'periodo' => $ejecucion['periodo'] ?? null,
        ];

        // KPIs que ya calculas y envías como hidden (mejores para el resumen):
        $kpis = [
            'disposiciones' => [
                'total' => (float) ($disposiciones['total_ponderado'] ?? 0),
                'obtenido' => (float) ($disposiciones['obtenido_ponderado'] ?? 0),
                'porcentaje' => (float) ($disposiciones['porcentaje_cumplimiento'] ?? 0),
            ],
            'ejecucion' => [
                'total' => (float) ($verificacion3['puntos_totales'] ?? 0),
                'obtenido' => (float) ($verificacion3['puntos_obtenidos'] ?? 0),
                'porcentaje' => (float) ($verificacion3['porcentaje'] ?? 0),
            ],
            'resultados' => [
                'total' => (float) ($resultadosSalud['puntos_totales'] ?? 0),
                'obtenido' => (float) ($resultadosSalud['puntos_obtenidos'] ?? 0),
                'porcentaje' => (float) ($resultadosSalud['porcentaje'] ?? 0),
            ],
        ];

        // Resumen por trimestre (matriz): % ejecucion (VE/VC) y ajustes
        // Normaliza items de matriz para el resumen (acepta 'items' o 'filas')
        $resumenMatriz = null;
        $matrizItems = [];
        $matrizTotales = null;
        if (!empty($matriz['items']) && is_array($matriz['items'])) {
            $matrizItems = $matriz['items'];
        } elseif (!empty($matriz['filas']) && is_array($matriz['filas'])) {
            $matrizItems = $matriz['filas'];
        }

        if (!empty($matrizItems)) {
            $byT = [
                'I' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'II' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'III' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'IV' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
            ];
            $tot = [ 'ac' => 0.0, 'ae' => 0.0, 'vc' => 0.0, 've' => 0.0, 'aj_sum' => 0.0, 'aj_global' => 0.0 ];
            foreach ($matrizItems as $row) {
                $per = $row['periodo'] ?? null;
                if (!isset($byT[$per]))
                    continue;
                // Acepta llaves tanto del frontend actual (vc, ve, ajuste) como nombres antiguos
                $byT[$per]['vc'] += (float) ($row['vc'] ?? $row['valor_contratado'] ?? 0);
                $byT[$per]['ve'] += (float) ($row['ve'] ?? $row['valor_ejecutado'] ?? 0);
                $byT[$per]['aj'] += (float) ($row['ajuste'] ?? $row['ajustes_a_realizar'] ?? 0);

                // Totales globales
                $tot['vc'] += (float) ($row['vc'] ?? $row['valor_contratado'] ?? 0);
                $tot['ve'] += (float) ($row['ve'] ?? $row['valor_ejecutado'] ?? 0);
                $tot['aj_sum'] += (float) ($row['ajuste'] ?? $row['ajustes_a_realizar'] ?? 0);
                $tot['ac'] += (float) ($row['act_contratadas'] ?? 0);
                $tot['ae'] += (float) ($row['act_ejecutadas'] ?? 0);
            }
            $pct = function ($vc, $ve) {
                return $vc > 0 ? ($ve / $vc) * 100.0 : 0.0; };
            $resumenMatriz = [
                'I' => ['porcentaje' => $pct($byT['I']['vc'], $byT['I']['ve']), 'ajustes' => $byT['I']['aj']],
                'II' => ['porcentaje' => $pct($byT['II']['vc'], $byT['II']['ve']), 'ajustes' => $byT['II']['aj']],
                'III' => ['porcentaje' => $pct($byT['III']['vc'], $byT['III']['ve']), 'ajustes' => $byT['III']['aj']],
                'IV' => ['porcentaje' => $pct($byT['IV']['vc'], $byT['IV']['ve']), 'ajustes' => $byT['IV']['aj']],
                'TOTAL' => [
                    'porcentaje' => $pct($byT['I']['vc'] + $byT['II']['vc'] + $byT['III']['vc'] + $byT['IV']['vc'], $byT['I']['ve'] + $byT['II']['ve'] + $byT['III']['ve'] + $byT['IV']['ve']),
                    'ajustes' => $byT['I']['aj'] + $byT['II']['aj'] + $byT['III']['aj'] + $byT['IV']['aj']
                ],
            ];

            // Ajuste total global basado en totales del footer (ratio de actividades)
            if ($tot['vc'] > 0 && $tot['ac'] > 0) {
                $factor = max(0.0, $tot['ae'] / $tot['ac']);
                $veGlobal = $tot['vc'] * $factor;
                $tot['aj_global'] = max(0.0, $tot['vc'] - $veGlobal);
            } else {
                $tot['aj_global'] = 0.0;
            }
            $matrizTotales = $tot;
        }

        // Renderiza la vista del PDF con todos los datos necesarios
        $pdf = Pdf::loadView('formularios.report', [
            'seleccion' => $seleccion,
            'basicos' => $basicos,
            'disposiciones' => $disposiciones,
            'ejecucion' => $ejecucion,
            'matriz' => $matriz,
            'verificacion3' => $verificacion3,
            'indicadoresAcceso' => $indicadoresAcceso,
            'indicadoresDeteccion' => $indicadoresDeteccion,
            'indicadoresPrecursoras' => $indicadoresPrecursoras,
            'indicadores' => $indicadoresBloque,
            'indicadoresImgDataUrl' => $indicadoresImgDataUrl,
            'resumenMatriz' => $resumenMatriz,
            'matrizTotales' => $matrizTotales,
            'resultadosSalud' => $resultadosSalud,
            'kpis' => $kpis,
            'serviciosBloque' => $serviciosBloque,
            'registroEspecialBloque' => $registroEspecialBloque,
        ])->setPaper('letter', 'portrait'); // o 'legal', 'a4'

        return $pdf->stream('reporte_auditoria.pdf'); // o ->download('reporte.pdf')
    }


    public function guardarEstadisticas(StoreEstadisticaRequest $request)
    {
        $anio = (int) $request->input('anio_vigencia');
        $periodo = $request->input('trimestre_eval'); // 'I' | 'I-II' | 'I-II-III' | 'I-II-III-IV'

        // Datos del prestador desde create.blade (selección)
        $departamento = $request->input('departamento');
        $sede = $request->input('sede');
        $nit = trim($request->input('nit'));
        $razonSocial = $request->input('razon_social');
        $tipoRed = $request->input('tipo_red');

        // Porcentajes/valores de secciones (ya calculados en tus pasos)
        $pctGen = (float) $request->input('pct_generalidades');   // segunda sección
        $pctEjec = (float) $request->input('pct_ejecucion');       // tercera sección
        $pctSalud = (float) $request->input('pct_resultado_salud'); // cuarta sección
        $ajuste = (float) $request->input('ajuste_trimestre');    // valor/porcentaje del ajuste (del trimestre)

        // --- Helpers de mapeo según periodo:
        // Columna grupo (i_ii | iii | iv) para generalidades/ejec_global_contrato/resultados_salud
        $grupoCol = match ($periodo) {
            'I', 'II', 'I-II' => 'i_ii',
            'I-II-III' => 'iii',
            'I-II-III-IV' => 'iv',
        };

        // Columna trimestral para EJECUCIÓN/AJUSTE (I | II | III | IV)
        $trimKey = match ($periodo) {
            'I' => 'i',
            'I-II' => 'ii',   // si quieres que al cerrar I-II uses II como ejecutado del último tramo
            'I-II-III' => 'iii',
            'I-II-III-IV' => 'iv',
        // Si prefieres otra lógica (p.ej. promediar I-II) puedes cambiar esto.
        };

        // Columnas de destino:
        $colEjecTrim = "ejecucion_{$trimKey}_trim_2024"; // p.ej. ejecucion_iv_trim_2024
        $colAjusteTrim = "ajuste_{$trimKey}_trim_2024";    // p.ej. ajuste_iv_trim_2024

        $colEjecGlobalContrato = "ejecucion_global_contrato_{$grupoCol}";
        $colSaludTrimGrupo = match ($grupoCol) {
            'i_ii' => 'resultados_salud_trim_i_ii',
            'iii' => 'resultados_salud_iii_trim',
            'iv' => 'resultados_salud_iv_trim',
        };
        $colGenGrupo = match ($grupoCol) {
            'i_ii' => 'generalidades_i_ii_trim',
            'iii' => 'generalidades_iii_trim',
            'iv' => 'generalidades_iv_trim',
        };

        // Valor de ejecución del trimestre: "porcentaje resultante del ajuste correspondiente"
        // Si tu ajuste es un % que corrige la ejecución, ajusta aquí:
        //   ejemplo: ejec_ajustada = clamp(0,100, pctEjec * (ajuste/100))  (o la fórmula que uses)
        // Si tu ajuste es monetario y no afecta el %, entonces deja $ejecTrimestral = $pctEjec
        $ejecTrimestral = $pctEjec; // <- reemplaza con tu fórmula real si aplica

        // Upsert: clave natural (nit + año). Si tu clave es distinta, ajusta el where/uniqueBy.
        $now = now();

        // Construimos payload base
        $payload = [
            'departamento' => $departamento,
            'sede' => $sede,
            'nit' => $nit,
            'razon_social' => $razonSocial,
            'tipo_red' => $tipoRed,
            'trimestre_evaluado' => $periodo,
            'anio_vigencia' => $anio,
            // Grupos
            $colEjecGlobalContrato => round($pctEjec, 1),
            $colSaludTrimGrupo => round($pctSalud, 1),
            $colGenGrupo => round($pctGen, 1),
            // Trimestre específico
            $colAjusteTrim => $ajuste,
            $colEjecTrim => round($ejecTrimestral, 1),
            // Marca de tiempo
            'creado_en' => $now, // si la columna es datetime de creación/actualización, podrías usar updated_at
        ];

        // Modo prueba: no escribe en BD, muestra el payload en el panel de debug
        if ($request->boolean('_dry')) {
            session()->flash('analytics_debug', [
                'modo' => 'dry-run',
                'anio' => $anio,
                'periodo' => $periodo,
                'seleccion' => compact('departamento', 'sede', 'nit', 'razonSocial', 'tipoRed'),
                'payload' => $payload,
            ]);
            $info = [
                'prestador' => $razonSocial,
                'sede' => $sede,
                'departamento' => $departamento,
                'periodo' => $periodo,
                'anio' => $anio,
            ];
            return back()
                ->with('ok', '(PRUEBA) Estadísticas NO guardadas. Revisa el panel de debug.')
                ->with('updated_info', $info)
                ->with($this->persistHtmlSnapshot($request, $nit, $sede, $periodo, $anio))
                ->with('stay_on_step', 5);
        }

        // (Opcional) Recalcular globales:
        // - ejecucion_global = promedio de ejecucion_i/ii/iii/iv no nulos
        // - resultados_salud_global = promedio de resultados_salud_trim_i_ii, ...iii_trim, ...iv_trim no nulos
        // - generalidades_globales = promedio de generalidades_i_ii_trim, ...iii_trim, ...iv_trim no nulos
        // - ajuste_total = suma o promedio (según tu definición) de ajustes existentes
        // Para hacerlo bien, primero lee la fila existente (si la hay), mezcla y recalcula:

        DB::connection('sqlsrv')->transaction(function () use ($nit, $departamento,$sede, $payload, $periodo) {
            $table = DB::connection('sqlsrv')->table('analytics.capita_estadisticas');

                $row = $table->where('nit', $nit)
                 ->where('departamento', $departamento)
                 ->where('sede', $sede) // <-- si tu columna es 'sede', cambia a ->where('sede', $municipio)
                 ->first();

            if ($row) {
                // merge y recalcular globales
                $merged = (object) array_merge((array) $row, $payload);

                // helpers
                $avg = function (array $values) {
                    $vals = array_values(array_filter($values, fn($v) => $v !== null));
                    if (!count($vals))
                        return null;
                    return round(array_sum($vals) / count($vals), 1);
                };

                $sum = function (array $values) {
                    $vals = array_values(array_filter($values, fn($v) => $v !== null));
                    if (!count($vals))
                        return null;
                    return array_sum($vals);
                };

                // Recalcular globales
                $ejecGlobal = $avg([
                    $merged->ejecucion_i_trim_2024 ?? null,
                    $merged->ejecucion_ii_trim_2024 ?? null,
                    $merged->ejecucion_iii_trim_2024 ?? null,
                    $merged->ejecucion_iv_trim_2024 ?? null,
                ]);

                $saludGlobal = $avg([
                    $merged->resultados_salud_trim_i_ii ?? null,
                    $merged->resultados_salud_iii_trim ?? null,
                    $merged->resultados_salud_iv_trim ?? null,
                ]);

                $genGlobal = $avg([
                    $merged->generalidades_i_ii_trim ?? null,
                    $merged->generalidades_iii_trim ?? null,
                    $merged->generalidades_iv_trim ?? null,
                ]);

                $ajusteTotal = $sum([
                    $merged->ajuste_i_trim_2024 ?? null,
                    $merged->ajuste_ii_trim_2024 ?? null,
                    $merged->ajuste_iii_trim_2024 ?? null,
                    $merged->ajuste_iv_trim_2024 ?? null,
                ]);

                // No sobrescribir los resultados globales; la tabla los calcula directamente

                $table->where('id', $row->id)->update($payload);
            } else {
                // No existe: inserta y luego podrías volver a actualizar globales si prefieres (aquí no hay históricos)
                $id = $table->insertGetId($payload + [
                    // si tu tabla usa timestamps automáticos, ajusta nombres
                ]);
            }

            // Actualiza el trimestre en la tabla fuente de selección
            DB::connection('sqlsrv')
                ->table('auditoria_capita.dbo.prestadores')
                ->whereRaw('LTRIM(RTRIM(nit)) = ?', [$nit])
                ->whereRaw('LTRIM(RTRIM(municipio)) = ?', [$sede])
                ->update(['trimestre' => $periodo]);
        });

        $info = [
            'prestador' => $razonSocial,
            'sede' => $sede,
            'departamento' => $departamento,
            'periodo' => $periodo,
            'anio' => $anio,
        ];

        return back()
            ->with('ok', 'Estadísticas actualizadas correctamente.')
            ->with('updated_info', $info)
            ->with($this->persistHtmlSnapshot($request, $nit, $sede, $periodo, $anio))
            ->with('stay_on_step', 5);
    }

    /**
     * Genera y persiste un HTML del formulario completo en storage/public.
     * Carpeta: formularios/{nit}-{sede}/
     * Archivo: formulario-{periodo}-{anio}-{timestamp}.html
     * Devuelve flashes para la sesión con la URL si se generó.
     */
    private function persistHtmlSnapshot(Request $request, string $nit, string $sede, string $periodo, int $anio): array
    {
                try {
            // Reutiliza la vista del PDF para construir el HTML con el mismo contexto
            $context = $this->buildReportContextFromRequest($request);

            $html = view('formularios.report', $context)->render();

            $folder = 'formularios/' . Str::slug($nit . '-' . $sede, '-');
            $filename = 'formulario-' . Str::slug($periodo ?: 'periodo', '-') . '-' . $anio . '-' . now()->format('Ymd_His') . '.html';
            $path = $folder . '/' . $filename;

            Storage::disk('public')->put($path, $html);

            return [
                'saved_html_path' => $path,
                'saved_html_url' => asset('storage/' . $path),
            ];
        } catch (\Throwable $e) {
            // En caso de error, no bloquear el flujo principal
            return [];
        }
    }

    /**
     * Arma el contexto que usa la vista de reporte a partir del Request actual.
     * (Lógica tomada de pdf()).
     */
    private function buildReportContextFromRequest(Request $request): array
    {
        $basicos = $request->input('basicos', []);
        $disposiciones = $request->input('disposiciones', []);
        $ejecucion = $request->input('ejecucion', []);
        $matriz = $request->input('matriz', []);
        $verificacion3 = $request->input('verificacion3', []);
        $indicadoresAcceso = $request->input('indicadores_acceso', []);
        $indicadoresDeteccion = $request->input('indicadores_deteccion', []);
        $indicadoresPrecursoras = $request->input('indicadores_precursoras', []);
        $indicadoresBloque = $request->input('indicadores', []);

        $indicadoresImgDataUrl = null;
        if ($request->hasFile('indicadores.imagen')) {
            $file = $request->file('indicadores.imagen');
            if ($file && $file->isValid()) {
                $mime = $file->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($file->getRealPath()));
                $indicadoresImgDataUrl = "data:$mime;base64,$data";
            }
        }
        $resultadosSalud = $request->input('resultados_salud', []);

        $serviciosBloque = [
            'descripcion' => $request->input('servicios.descripcion')
        ];
        if ($request->hasFile('servicios.imagen')) {
            $f = $request->file('servicios.imagen');
            if ($f && $f->isValid()) {
                $mime = $f->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($f->getRealPath()));
                $serviciosBloque['imgDataUrl'] = "data:$mime;base64,$data";
            }
        }

        $registroEspecialBloque = [
            'descripcion' => $request->input('registro_especial.descripcion')
        ];
        if ($request->hasFile('registro_especial.imagen')) {
            $f = $request->file('registro_especial.imagen');
            if ($f && $f->isValid()) {
                $mime = $f->getMimeType() ?: 'image/png';
                $data = base64_encode(file_get_contents($f->getRealPath()));
                $registroEspecialBloque['imgDataUrl'] = "data:$mime;base64,$data";
            }
        }

        $seleccion = [
            'prestador' => $ejecucion['prestador'] ?? ($basicos['prestador'] ?? null),
            'departamento' => $ejecucion['departamento'] ?? ($basicos['departamento'] ?? null),
            'municipio' => $ejecucion['municipio'] ?? ($basicos['municipio'] ?? null),
            'periodo' => $ejecucion['periodo'] ?? null,
        ];

        $kpis = [
            'disposiciones' => [
                'total' => (float) ($disposiciones['total_ponderado'] ?? 0),
                'obtenido' => (float) ($disposiciones['obtenido_ponderado'] ?? 0),
                'porcentaje' => (float) ($disposiciones['porcentaje_cumplimiento'] ?? 0),
            ],
            'ejecucion' => [
                'total' => (float) ($verificacion3['puntos_totales'] ?? 0),
                'obtenido' => (float) ($verificacion3['puntos_obtenidos'] ?? 0),
                'porcentaje' => (float) ($verificacion3['porcentaje'] ?? 0),
            ],
            'resultados' => [
                'total' => (float) ($resultadosSalud['puntos_totales'] ?? 0),
                'obtenido' => (float) ($resultadosSalud['puntos_obtenidos'] ?? 0),
                'porcentaje' => (float) ($resultadosSalud['porcentaje'] ?? 0),
            ],
        ];

        $resumenMatriz = null;
        $matrizItems = [];
        if (!empty($matriz['items']) && is_array($matriz['items'])) {
            $matrizItems = $matriz['items'];
        } elseif (!empty($matriz['filas']) && is_array($matriz['filas'])) {
            $matrizItems = $matriz['filas'];
        }

        if (!empty($matrizItems)) {
            $byT = [
                'I' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'II' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'III' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
                'IV' => ['vc' => 0.0, 've' => 0.0, 'aj' => 0.0],
            ];
            $tot = [ 'ac' => 0.0, 'ae' => 0.0, 'vc' => 0.0, 've' => 0.0, 'aj_sum' => 0.0, 'aj_global' => 0.0 ];
            foreach ($matrizItems as $row) {
                $per = $row['periodo'] ?? null;
                if (!isset($byT[$per])) continue;
                $byT[$per]['vc'] += (float) ($row['vc'] ?? $row['valor_contratado'] ?? 0);
                $byT[$per]['ve'] += (float) ($row['ve'] ?? $row['valor_ejecutado'] ?? 0);
                $byT[$per]['aj'] += (float) ($row['ajuste'] ?? $row['ajustes_a_realizar'] ?? 0);

                // Totales globales
                $tot['vc'] += (float) ($row['vc'] ?? $row['valor_contratado'] ?? 0);
                $tot['ve'] += (float) ($row['ve'] ?? $row['valor_ejecutado'] ?? 0);
                $tot['aj_sum'] += (float) ($row['ajuste'] ?? $row['ajustes_a_realizar'] ?? 0);
                $tot['ac'] += (float) ($row['act_contratadas'] ?? 0);
                $tot['ae'] += (float) ($row['act_ejecutadas'] ?? 0);
            }
            $pct = function ($vc, $ve) { return $vc > 0 ? ($ve / $vc) * 100.0 : 0.0; };
            $resumenMatriz = [
                'I' => ['porcentaje' => $pct($byT['I']['vc'], $byT['I']['ve']), 'ajustes' => $byT['I']['aj']],
                'II' => ['porcentaje' => $pct($byT['II']['vc'], $byT['II']['ve']), 'ajustes' => $byT['II']['aj']],
                'III' => ['porcentaje' => $pct($byT['III']['vc'], $byT['III']['ve']), 'ajustes' => $byT['III']['aj']],
                'IV' => ['porcentaje' => $pct($byT['IV']['vc'], $byT['IV']['ve']), 'ajustes' => $byT['IV']['aj']],
                'TOTAL' => [
                    'porcentaje' => $pct($byT['I']['vc'] + $byT['II']['vc'] + $byT['III']['vc'] + $byT['IV']['vc'], $byT['I']['ve'] + $byT['II']['ve'] + $byT['III']['ve'] + $byT['IV']['ve']),
                    'ajustes' => $byT['I']['aj'] + $byT['II']['aj'] + $byT['III']['aj'] + $byT['IV']['aj']
                ],
            ];

            // Ajuste total global basado en ratio de actividades (si existen)
            if ($tot['vc'] > 0 && $tot['ac'] > 0) {
                $factor = max(0.0, $tot['ae'] / $tot['ac']);
                $veGlobal = $tot['vc'] * $factor;
                $tot['aj_global'] = max(0.0, $tot['vc'] - $veGlobal);
            } else {
                $tot['aj_global'] = 0.0;
            }
            $matrizTotales = $tot;
        }

        return [
            'seleccion' => $seleccion,
            'basicos' => $basicos,
            'disposiciones' => $disposiciones,
            'ejecucion' => $ejecucion,
            'matriz' => $matriz,
            'verificacion3' => $verificacion3,
            'indicadoresAcceso' => $indicadoresAcceso,
            'indicadoresDeteccion' => $indicadoresDeteccion,
            'indicadoresPrecursoras' => $indicadoresPrecursoras,
            'indicadores' => $indicadoresBloque,
            'indicadoresImgDataUrl' => $indicadoresImgDataUrl,
            'resumenMatriz' => $resumenMatriz,
            'matrizTotales' => $matrizTotales,
            'resultadosSalud' => $resultadosSalud,
            'kpis' => $kpis,
            'serviciosBloque' => $serviciosBloque,
            'registroEspecialBloque' => $registroEspecialBloque,
        ];
    }

}
