<?php

namespace App\Http\Controllers;

use App\Models\Venta;
use App\Models\VentaDetalle;
use App\Models\Cliente;
use App\Models\Producto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class VentaController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $ventas = Venta::with('cliente', 'detalles')->orderBy('created_at', 'desc')->get();
        return view('ventas.index', compact('ventas'));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        $clientes = Cliente::where('estado', true)->orderBy('nombre')->get();
        $productos = Producto::where('estado', true)->where('stock_actual', '>', 0)->orderBy('nombre')->get();
        return view('ventas.create', compact('clientes', 'productos'));
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'cliente_id' => 'required|exists:clientes,id',
            'fecha_venta' => 'required|date',
            'tipo_pago' => 'required|in:efectivo,tarjeta,transferencia',
            'observaciones' => 'nullable|string',
            'productos' => 'required|array|min:1',
            'productos.*.producto_id' => 'required|exists:productos,id',
            'productos.*.cantidad' => 'required|integer|min:1',
            'productos.*.precio_unitario' => 'required|numeric|min:0',
        ]);

        DB::beginTransaction();

        try {
            // Validar stock disponible
            foreach ($request->productos as $prod) {
                $producto = Producto::find($prod['producto_id']);
                if ($producto->stock_actual < $prod['cantidad']) {
                    throw new \Exception("Stock insuficiente para {$producto->nombre}. Disponible: {$producto->stock_actual}");
                }
            }

            // Generar número de venta
            $ultimaVenta = Venta::latest('id')->first();
            $numeroVenta = 'VENT-' . str_pad(($ultimaVenta ? $ultimaVenta->id + 1 : 1), 6, '0', STR_PAD_LEFT);

            // Calcular total
            $total = 0;
            foreach ($request->productos as $prod) {
                $total += $prod['cantidad'] * $prod['precio_unitario'];
            }

            // Crear venta
            $venta = Venta::create([
                'numero_venta' => $numeroVenta,
                'cliente_id' => $request->cliente_id,
                'fecha_venta' => $request->fecha_venta,
                'total' => $total,
                'estado' => 'completada',
                'tipo_pago' => $request->tipo_pago,
                'observaciones' => $request->observaciones,
            ]);

            // Crear detalles y actualizar stock
            foreach ($request->productos as $prod) {
                $subtotal = $prod['cantidad'] * $prod['precio_unitario'];

                VentaDetalle::create([
                    'venta_id' => $venta->id,
                    'producto_id' => $prod['producto_id'],
                    'cantidad' => $prod['cantidad'],
                    'precio_unitario' => $prod['precio_unitario'],
                    'subtotal' => $subtotal,
                ]);

                // Restar stock
                $producto = Producto::find($prod['producto_id']);
                $producto->stock_actual -= $prod['cantidad'];
                $producto->save();
            }

            DB::commit();

            return redirect()->route('ventas.show', $venta)
                ->with('success', 'Venta registrada exitosamente');

        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()
                ->withInput()
                ->with('error', 'Error al registrar la venta: ' . $e->getMessage());
        }
    }

    /**
     * Display the specified resource.
     */
    public function show(Venta $venta)
    {
        $venta->load('cliente', 'detalles.producto');
        return view('ventas.show', compact('venta'));
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        // No se permite editar ventas por integridad de inventario
        return redirect()->route('ventas.index')
            ->with('error', 'No se puede editar una venta registrada');
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        // No se permite editar ventas por integridad de inventario
        return redirect()->route('ventas.index')
            ->with('error', 'No se puede editar una venta registrada');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Venta $venta)
    {
        DB::beginTransaction();

        try {
            // Devolver stock si la venta estaba completada
            if ($venta->estado === 'completada') {
                foreach ($venta->detalles as $detalle) {
                    $producto = Producto::find($detalle->producto_id);
                    $producto->stock_actual += $detalle->cantidad;
                    $producto->save();
                }
            }

            $venta->delete();
            DB::commit();

            return redirect()->route('ventas.index')
                ->with('success', 'Venta eliminada exitosamente');

        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()
                ->with('error', 'Error al eliminar la venta: ' . $e->getMessage());
        }
    }
}
