<?php

namespace App\Http\Controllers;

use App\Models\OrdenLavanderia;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class VentasController extends Controller
{
    /**
     * Ventas agregadas por mes (órdenes entregadas).
     * Opcional: ?year=2026 para filtrar por año, ?month=1..12 para filtrar por mes.
     *
     * Incluye `lineas_catalogo_pos`: total de líneas de detalle con `laundry_sale_product_id` en órdenes
     * entregadas de ese bucket (complementa el CSV `laundry_sale_lines_count` por orden).
     */
    public function mensual(Request $request): JsonResponse
    {
        $year = $request->integer('year');
        $month = $request->integer('month');

        $posLineCounts = DB::table('orden_lavanderia_detalles')
            ->select('orden_lavanderia_id', DB::raw('COUNT(*) as pos_line_count'))
            ->whereNotNull('laundry_sale_product_id')
            ->groupBy('orden_lavanderia_id');

        $query = OrdenLavanderia::query()
            ->where('ordenes_lavanderia.estatus', OrdenLavanderia::ESTATUS_ENTREGADO)
            ->whereNotNull('ordenes_lavanderia.entregado_at');

        if ($year > 0) {
            $query->whereYear('ordenes_lavanderia.entregado_at', $year);
        }
        if ($month >= 1 && $month <= 12) {
            $query->whereMonth('ordenes_lavanderia.entregado_at', $month);
        }

        $entregadoCol = 'ordenes_lavanderia.entregado_at';
        $driver = $query->getConnection()->getDriverName();
        $yearExpr = $driver === 'sqlite'
            ? "CAST(strftime('%Y', {$entregadoCol}) AS INTEGER)"
            : "YEAR({$entregadoCol})";
        $monthExpr = $driver === 'sqlite'
            ? "CAST(strftime('%m', {$entregadoCol}) AS INTEGER)"
            : "MONTH({$entregadoCol})";

        $resumen = $query
            ->leftJoinSub($posLineCounts, 'pos_lines', 'pos_lines.orden_lavanderia_id', '=', 'ordenes_lavanderia.id')
            ->selectRaw(
                "{$yearExpr} as anio, {$monthExpr} as mes, "
                .'SUM(ordenes_lavanderia.total) as total_ventas, COUNT(ordenes_lavanderia.id) as cantidad_ordenes, '
                .'SUM(COALESCE(pos_lines.pos_line_count, 0)) as lineas_catalogo_pos'
            )
            ->groupByRaw("{$yearExpr}, {$monthExpr}")
            ->orderByRaw("{$yearExpr} DESC, {$monthExpr} DESC")
            ->get();

        $meses = [
            1 => 'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril',
            5 => 'Mayo', 6 => 'Junio', 7 => 'Julio', 8 => 'Agosto',
            9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre',
        ];

        $data = $resumen->map(function ($row) use ($meses) {
            return [
                'anio' => (int) $row->anio,
                'mes' => (int) $row->mes,
                'mes_nombre' => $meses[(int) $row->mes] ?? '',
                'total_ventas' => (float) $row->total_ventas,
                'cantidad_ordenes' => (int) $row->cantidad_ordenes,
                'lineas_catalogo_pos' => (int) $row->lineas_catalogo_pos,
            ];
        });

        return response()->json([
            'data' => $data,
        ], JsonResponse::HTTP_OK);
    }
}
