<?php

namespace App\Http\Controllers;

use App\Models\Empleado;
use App\Models\Incapacidad;
use App\Models\Periodo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class IncapacidadController extends Controller
{
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            // Módulo desactivable desde Parámetros
            if (!\App\Models\Configuracion::getBool('modulo_incapacidades', true)) {
                abort(404);
            }
            // SST tiene acceso completo a incapacidades (es su función principal)
            if (!auth()->user()->puedeVerReportes()) abort(403);
            return $next($request);
        });
    }

    public function index(Request $request)
    {
        $anio      = $request->anio ?? date('Y');
        $empleadoId= $request->empleado_id;

        $query = Incapacidad::with('empleado')
            ->whereYear('fecha_inicio', $anio)
            ->orderByDesc('fecha_inicio');

        if ($empleadoId) {
            $query->where('empleado_id', $empleadoId);
        }

        $incapacidades = $query->get();
        $empleados     = Empleado::activos()->orderBy('nombre')->get();
        $anios         = range(date('Y') - 3, date('Y') + 1);

        // Totales del filtro
        $totales = [
            'dias'             => $incapacidades->sum('dias'),
            'valor_empleador'  => $incapacidades->sum('valor_empleador'),
            'valor_eps'        => $incapacidades->sum('valor_eps') + $incapacidades->sum('valor_eps2'),
            'valor_arl'        => $incapacidades->sum('valor_arl'),
            'total_pagado'     => $incapacidades->sum('total_pagado'),
        ];

        return view('incapacidades.index',
            compact('incapacidades', 'empleados', 'anio', 'anios', 'empleadoId', 'totales'));
    }

    public function create()
    {
        $empleados = Empleado::activos()->orderBy('nombre')->get();
        return view('incapacidades.create', compact('empleados'));
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'empleado_id'     => 'required|exists:empleados,id',
            'fecha_inicio'    => 'required|date',
            'fecha_fin'       => 'required|date|after_or_equal:fecha_inicio',
            'tipo'            => 'required|in:enfermedad_general,accidente_trabajo,enfermedad_profesional,maternidad,paternidad',
            'diagnostico'     => 'nullable|string|max:200',
            'numero_radicado' => 'nullable|string|max:50',
            'observaciones'   => 'nullable|string',
        ]);

        $dias = Incapacidad::calcularDias($data['fecha_inicio'], $data['fecha_fin']);

        $incap = new Incapacidad($data + [
            'dias'       => $dias,
            'creado_por' => Auth::id(),
        ]);
        $incap->calcularValores();
        $incap->save();

        return redirect()->route('incapacidades.index')
            ->with('success', "Incapacidad registrada — {$dias} días.");
    }

    public function edit(Incapacidad $incapacidad)
    {
        $empleados = Empleado::activos()->orderBy('nombre')->get();
        return view('incapacidades.edit', compact('incapacidad', 'empleados'));
    }

    public function update(Request $request, Incapacidad $incapacidad)
    {
        $data = $request->validate([
            'empleado_id'     => 'required|exists:empleados,id',
            'fecha_inicio'    => 'required|date',
            'fecha_fin'       => 'required|date|after_or_equal:fecha_inicio',
            'tipo'            => 'required|in:enfermedad_general,accidente_trabajo,enfermedad_profesional,maternidad,paternidad',
            'diagnostico'     => 'nullable|string|max:200',
            'numero_radicado' => 'nullable|string|max:50',
            'observaciones'   => 'nullable|string',
        ]);

        $dias = Incapacidad::calcularDias($data['fecha_inicio'], $data['fecha_fin']);
        $incapacidad->fill($data + ['dias' => $dias]);
        $incapacidad->calcularValores();
        $incapacidad->save();

        return redirect()->route('incapacidades.index')
            ->with('success', 'Incapacidad actualizada.');
    }

    public function destroy(Incapacidad $incapacidad)
    {
        $incapacidad->delete();
        return back()->with('success', 'Incapacidad eliminada.');
    }

    // ─── EXPORTAR CSV ──────────────────────────────────────

    public function exportarCsv(Request $request)
    {
        $anio  = $request->anio ?? date('Y');
        $items = Incapacidad::with('empleado')
            ->whereYear('fecha_inicio', $anio)
            ->orderBy('empleado_id')
            ->orderBy('fecha_inicio')
            ->get();

        $filename = "incapacidades_{$anio}.csv";
        $headers  = [
            'Content-Type'        => 'text/csv; charset=UTF-8',
            'Content-Disposition' => "attachment; filename=\"{$filename}\"",
        ];

        $cols = [
            'Empleado','Cedula','Tipo','Fecha Inicio','Fecha Fin','Dias',
            'Diagnostico','Radicado',
            'Dias Empleador','Valor Empleador',
            'Dias EPS (1-90)','Valor EPS (1-90)',
            'Dias EPS (91-180)','Valor EPS (91-180)',
            'Dias ARL','Valor ARL',
            'Total Pagado',
        ];

        $callback = function () use ($items, $cols) {
            $out = fopen('php://output', 'w');
            fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF)); // UTF-8 BOM para Excel
            fputcsv($out, $cols, ';');
            foreach ($items as $i) {
                fputcsv($out, [
                    $i->empleado->nombre,
                    $i->empleado->cedula,
                    $i->tipo_label,
                    $i->fecha_inicio->format('d/m/Y'),
                    $i->fecha_fin->format('d/m/Y'),
                    $i->dias,
                    $i->diagnostico,
                    $i->numero_radicado,
                    $i->dias_empleador,
                    number_format($i->valor_empleador, 2, '.', ''),
                    $i->dias_eps,
                    number_format($i->valor_eps, 2, '.', ''),
                    $i->dias_eps2,
                    number_format($i->valor_eps2, 2, '.', ''),
                    $i->dias_arl,
                    number_format($i->valor_arl, 2, '.', ''),
                    number_format($i->total_pagado, 2, '.', ''),
                ], ';');
            }
            fclose($out);
        };

        return response()->stream($callback, 200, $headers);
    }
}