<?php

namespace App\Http\Controllers;

use App\Exports\OrdenesExport;
use App\Models\Area;
use App\Models\OrdenTrabajo;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;

class ReporteController extends Controller
{
    public function index(Request $r)
    {
        $areas = Area::where('activo',1)->orderBy('nombre')->get();
        return view('reportes.index', compact('areas'));
    }

    public function exportarOrdenesExcel(Request $r)
    {
        $filtros = $r->only(['clase','desde','hasta','area_id']);
        $nombre = 'ordenes_' . now()->format('Ymd_His') . '.xlsx';
        return Excel::download(new OrdenesExport($filtros), $nombre);
    }

    public function exportarOrdenesPdf(Request $r)
    {
        $q = OrdenTrabajo::with(['equipo','area','estado','prioridad','responsable']);
        if ($r->filled('clase')) $q->where('clase', $r->clase);
        if ($r->filled('desde')) $q->whereDate('fecha_programada','>=',$r->desde);
        if ($r->filled('hasta')) $q->whereDate('fecha_programada','<=',$r->hasta);
        if ($r->filled('area_id')) $q->where('area_id',$r->area_id);
        $ordenes = $q->orderByDesc('fecha_programada')->get();
        $pdf = Pdf::loadView('reportes.ordenes_pdf', compact('ordenes','r'))->setPaper('a4','landscape');
        return $pdf->stream('ordenes.pdf');
    }

    public function cumplimiento(Request $r)
    {
        $desde = $r->date('desde') ?: now()->startOfYear();
        $hasta = $r->date('hasta') ?: now();
        $datos = DB::table('ordenes_trabajo')
            ->leftJoin('areas','ordenes_trabajo.area_id','=','areas.id')
            ->leftJoin('estados_orden','ordenes_trabajo.estado_id','=','estados_orden.id')
            ->whereBetween('fecha_programada', [$desde, $hasta])
            ->select('areas.nombre as area',
                DB::raw('count(*) as total'),
                DB::raw("sum(case when estados_orden.codigo in ('EJE','APR') then 1 else 0 end) as ejecutadas"),
                DB::raw("sum(case when estados_orden.codigo='VEN' then 1 else 0 end) as vencidas"),
                DB::raw('sum(costo_total) as costo'))
            ->groupBy('areas.nombre')->get();
        return view('reportes.cumplimiento', compact('datos','desde','hasta'));
    }
}
