<?php
namespace App\Http\Controllers\Api;

use App\Models\Venta;
use App\Models\OrdenServicio;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ReportesController extends Controller
{
    public function index(Request $request)
    {
        $desde = $request->get('fecha_desde', now()->startOfMonth()->toDateString());
        $hasta = $request->get('fecha_hasta', now()->toDateString());

        // ── Ventas de productos ──────────────────────────────────
        $ventasBase = Venta::where('activo', 1)
            ->whereBetween(DB::raw('DATE(created_at)'), [$desde, $hasta]);

        $ingresos_ventas = (clone $ventasBase)->sum('total');

        // Ganancia = (precio_unitario - precio_costo) * cantidad por cada detalle
        $ganancia_ventas = DB::table('detalle_ventas as dv')
            ->join('ventas as v',    'v.id',  '=', 'dv.venta_id')
            ->join('productos as p', 'p.id',  '=', 'dv.producto_id')
            ->where('v.activo', 1)
            ->whereBetween(DB::raw('DATE(v.created_at)'), [$desde, $hasta])
            ->selectRaw('SUM((dv.precio_unitario - p.precio_costo) * dv.cantidad) as ganancia')
            ->value('ganancia') ?? 0;

        $transacciones_ventas = (clone $ventasBase)->count();

        // ── Servicio técnico (solo Entregado) ────────────────────
        $servicioBase = OrdenServicio::where('activo', 1)
            ->where('estado', 'Entregado')
            ->whereBetween(DB::raw('DATE(updated_at)'), [$desde, $hasta]);

        $servicioRaw = DB::table('ordenes_servicio')
            ->where('activo', 1)
            ->where('estado', 'Entregado')
            ->whereBetween(DB::raw('DATE(updated_at)'), [$desde, $hasta])
            ->selectRaw('
                SUM(COALESCE(precio_reparacion, 0)) as cobrado,
                SUM(COALESCE(costo_reparacion, 0)) as costo,
                SUM(COALESCE(precio_reparacion, 0) - COALESCE(costo_reparacion, 0)) as ganancia,
                COUNT(*) as ordenes
            ')
            ->first();

        $cobrado_servicio   = $servicioRaw->cobrado  ?? 0;
        $costo_servicio     = $servicioRaw->costo    ?? 0;
        $ganancia_servicio  = $servicioRaw->ganancia ?? 0;
        $ordenes_entregadas = $servicioRaw->ordenes  ?? 0;

        // ── Detalle diario ───────────────────────────────────────
        $detalle_ventas = DB::table('detalle_ventas as dv')
            ->join('ventas as v',    'v.id',  '=', 'dv.venta_id')
            ->join('productos as p', 'p.id',  '=', 'dv.producto_id')
            ->where('v.activo', 1)
            ->whereBetween(DB::raw('DATE(v.created_at)'), [$desde, $hasta])
            ->selectRaw('DATE(v.created_at) as fecha, SUM(v.total) as ingresos, SUM((dv.precio_unitario - p.precio_costo) * dv.cantidad) as ganancia')
            ->groupBy('fecha')
            ->orderBy('fecha')
            ->get();

        $detalle_servicio = DB::table('ordenes_servicio')
            ->where('activo', 1)
            ->where('estado', 'Entregado')
            ->whereBetween(DB::raw('DATE(updated_at)'), [$desde, $hasta])
            ->selectRaw('
                DATE(updated_at) as fecha,
                SUM(COALESCE(precio_reparacion, 0)) as cobrado,
                SUM(COALESCE(costo_reparacion, 0)) as costo,
                SUM(COALESCE(precio_reparacion, 0) - COALESCE(costo_reparacion, 0)) as ganancia,
                COUNT(*) as ordenes
            ')
            ->groupBy('fecha')
            ->orderBy('fecha')
            ->get();

        // ── Top productos más rentables ──────────────────────────
        $top_productos = DB::table('detalle_ventas as dv')
            ->join('ventas as v',    'v.id',  '=', 'dv.venta_id')
            ->join('productos as p', 'p.id',  '=', 'dv.producto_id')
            ->where('v.activo', 1)
            ->whereBetween(DB::raw('DATE(v.created_at)'), [$desde, $hasta])
            ->selectRaw('p.nombre, p.sku, SUM(dv.cantidad) as unidades, SUM(dv.subtotal) as ingresos, SUM((dv.precio_unitario - p.precio_costo) * dv.cantidad) as ganancia')
            ->groupBy('p.id', 'p.nombre', 'p.sku')
            ->orderByDesc('ganancia')
            ->limit(10)
            ->get();

        // ── Movimientos de inventario (detalle por movimiento) ───
        $movimientos_detalle = DB::table('movimientos_inventario as m')
            ->join('productos as p', 'p.id', '=', 'm.producto_id')
            ->whereBetween(DB::raw('DATE(m.created_at)'), [$desde, $hasta])
            ->selectRaw('
                m.id,
                m.tipo,
                m.cantidad,
                m.precio_unitario,
                (m.cantidad * m.precio_unitario) as costo_total,
                m.motivo,
                m.usuario,
                m.created_at,
                p.nombre as producto_nombre,
                p.sku as producto_sku
            ')
            ->orderByDesc('m.created_at')
            ->get();

        $totales_mov = DB::table('movimientos_inventario')
            ->whereBetween(DB::raw('DATE(created_at)'), [$desde, $hasta])
            ->selectRaw('tipo, SUM(cantidad) as unidades, SUM(cantidad * precio_unitario) as valor')
            ->groupBy('tipo')->get()->keyBy('tipo');

        // ── Resumen por producto ─────────────────────────────────
        $resumen_productos = DB::table('movimientos_inventario as m')
            ->join('productos as p', 'p.id', '=', 'm.producto_id')
            ->whereBetween(DB::raw('DATE(m.created_at)'), [$desde, $hasta])
            ->selectRaw('
                p.id as producto_id,
                p.nombre as producto_nombre,
                p.sku as producto_sku,
                p.stock as stock_actual,
                p.precio_costo,
                SUM(CASE WHEN m.tipo = "Entrada" THEN m.cantidad ELSE 0 END) as entradas_uds,
                SUM(CASE WHEN m.tipo = "Entrada" THEN m.cantidad * m.precio_unitario ELSE 0 END) as entradas_costo,
                SUM(CASE WHEN m.tipo = "Salida"  THEN m.cantidad ELSE 0 END) as salidas_uds,
                SUM(CASE WHEN m.tipo = "Salida"  THEN m.cantidad * m.precio_unitario ELSE 0 END) as salidas_costo
            ')
            ->groupBy('p.id', 'p.nombre', 'p.sku', 'p.stock', 'p.precio_costo')
            ->orderBy('p.nombre')
            ->get()
            ->map(function ($row) {
                $row->valor_en_stock = $row->stock_actual * $row->precio_costo;
                return $row;
            });

        return response()->json([
            'periodo' => ['desde' => $desde, 'hasta' => $hasta],

            'ventas' => [
                'ingresos'       => round($ingresos_ventas, 2),
                'ganancia'       => round($ganancia_ventas, 2),
                'transacciones'  => $transacciones_ventas,
            ],
            'servicio' => [
                'cobrado'        => round($cobrado_servicio, 2),
                'costo'          => round($costo_servicio, 2),
                'ganancia'       => round($ganancia_servicio, 2),
                'ordenes'        => $ordenes_entregadas,
            ],
            'total' => [
                'ingresos'       => round($ingresos_ventas + $cobrado_servicio, 2),
                'ganancia'       => round($ganancia_ventas + $ganancia_servicio, 2),
            ],

            'detalle_ventas'      => $detalle_ventas,
            'detalle_servicio'    => $detalle_servicio,
            'top_productos'       => $top_productos,
            'movimientos_detalle' => $movimientos_detalle,
            'totales_mov'         => $totales_mov,
            'resumen_productos'   => $resumen_productos,
        ]);
    }
}
