<?php

namespace App\Http\Controllers;

use App\Http\Requests\AlmacenFormRequest;
use App\Models\Almacen;
use App\Models\AlmacenProducto;
use App\Models\Producto;
use DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;

class AlmacenController extends Controller
{
    private $fpdf;

    public function __construct()
    {
        $this->middleware('permission:almacen-list|almacen-create|almacen-edit|almacen-delete|almacen-agregar_productos', ['only' => ['index', 'show']]);
        $this->middleware('permission:almacen-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:almacen-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:almacen-delete', ['only' => ['destroy']]);
    }

    public function index(Request $request)
    {
        if ($request) {
            $query = trim($request->get('searchText'));
            $almacenes = DB::table('almacen')
                ->where(function ($q) use ($query) {
                    $q->where('almacen', 'LIKE', '%' . $query . '%')
                        ->orwhere('nivel', 'LIKE', '%' . $query . '%')
                        ->orwhere('sucursal', 'LIKE', '%' . $query . '%')
                        ->orwhere('ubicacion', 'LIKE', '%' . $query . '%');
                })
                ->orderBy('id_almacen', 'desc')
                ->paginate(10);

            return view('almacen.almacenes.index', ['almacenes' => $almacenes, 'searchText' => $query]);
        }
    }

    public function create()
    {
        return view('almacen.almacenes.create');
    }

    public function store(AlmacenFormRequest $request)
    {
        $almacen = new Almacen;
        $almacen->almacen = $request->get('almacen');
        $almacen->nivel = $request->get('nivel');
        $almacen->sucursal = $request->get('sucursal');
        $almacen->ubicacion = $request->get('ubicacion');
        $almacen->save();

        session::flash('statuscode', 'success');

        return Redirect::to('almacen/almacenes')->with('status', 'Almacen creado con éxito.');
    }

    public function show($id)
    {
        return view('almacen.almacenes.show', ['almacenes' => Almacen::findOrfail($id)]);
    }

    public function edit($id)
    {
        return view('almacen.almacenes.edit', ['almacenes' => Almacen::findOrfail($id)]);
    }

    public function obtener_producto($nombre)
    {
        // Buscar el producto por su nombre
        $producto = Producto::where('nombre', $nombre)->first();

        // Si el producto no existe, devolver un error
        if (!$producto) {
            return response()->json(['error' => 'Producto no encontrado'], 404);
        }

        // Devolver los datos del producto como JSON
        return response()->json($producto);
    }

    public function agregar_producto_almacen(Request $request)
    {
        // Buscar el producto correspondiente en el modelo AlmacenProducto
        $producto = AlmacenProducto::where('codigo', $request->codigo)
            ->where('nombre_almacen', $request->nombre_almacen)
            ->first();

        $productoOriginal = Producto::where('codigo', $request->codigo)->first();

        // Si el producto existe, actualizarlo
        if ($producto && $productoOriginal && $productoOriginal->cantidad_compradas > 0) {
            $producto->cantidad_almacen += $request->cantidad_almacen;
            $producto->update();

            $productoOriginal->decrement('cantidad_compradas', $request->cantidad_almacen);

            return response()->json(['message' => 'Cantidad actualizada', 'type' => 'success']);
        } else if (!$producto && $productoOriginal && $productoOriginal->cantidad_compradas > 0) {
            // Si el producto no existe, crear uno nuevo
            $producto = new AlmacenProducto;
            $producto->nombre_producto = $request->nombre_producto;
            $producto->codigo = $request->codigo;
            $producto->descripcion = $request->descripcion;
            $producto->tipo = $request->tipo;
            $producto->presentacion = $request->presentacion;
            $producto->precio_venta = $request->precio_venta;
            $producto->unidad_medida = $request->unidad_medida;
            $producto->fecha_fabricacion = $request->fecha_fabricacion;
            $producto->fecha_vencimiento = $request->fecha_vencimiento;
            $producto->cantidad_almacen = $request->cantidad_almacen;
            $producto->nombre_almacen = $request->nombre_almacen;
            $producto->fecha_entrada = now(); // Registrar la fecha de entrada
            $producto->save();

            $productoOriginal->decrement('cantidad_compradas', $request->cantidad_almacen);

            return response()->json(['message' => 'Producto almacenado correctamente']);
        } else {
            // Lanzar una alerta o un error cuando la cantidad del producto es 0 o negativa
            return response()->json(['message' => 'Stock no disponible', 'type' => 'error']);
        }
    }

    public function agregar_almacen($id)
    {
        $productos = Producto::all();

        $almacenes_select = DB::table('almacen')->select('almacen')->distinct()->get();

        return view('almacen/almacenes/agregar_almacen', ['almacenes' => Almacen::findOrfail($id), 'almacenes_select' => $almacenes_select], compact('productos'));
    }

    public function mostrar_producto_almacen($nombre_almacen)
    {
        // Buscar el producto por su nombre
        $productos = AlmacenProducto::where('nombre_almacen', $nombre_almacen)->get();

        // Si el producto no existe, devolver un error
        if (!$productos) {
            return response()->json(['error' => 'Producto no encontrado'], 404);
        }

        // Devolver los datos del producto como JSON
        return response()->json($productos);
    }

    public function contarProducto_almacen($almacen)
    {
        $conteo = AlmacenProducto::where('nombre_almacen', $almacen)->count();

        // Si el producto no existe, devolver un error
        if (!$conteo) {
            return response()->json(['error' => 'Producto no encontrado'], 404);
        }

        // Devolver los datos del producto como JSON
        return response()->json($conteo);
    }

    public function traspasar_producto(Request $request, $id)
    {
        $almacenProducto = AlmacenProducto::findOrFail($id);
        $cantidad_a_traspasar = $request->get('cantidad_almacen');

        // Verificar si la cantidad a traspasar es mayor que la cantidad en el almacén
        if ($almacenProducto->cantidad_almacen < $cantidad_a_traspasar) {
            return Redirect::to('almacen/almacenes')->with('status', 'La cantidad a traspasar es mayor que la cantidad en el almacén.');
        }

        // Obtener el código del producto
        $codigo_producto = $request->get('codigo');

        // Buscar si existe otro producto con el mismo código en el nuevo almacén
        $producto_existente = AlmacenProducto::where('nombre_almacen', $request->get('nombre_almacen'))
            ->where('codigo', $codigo_producto)
            ->first();

        if ($producto_existente) {
            // Si existe, sumar la cantidad
            $producto_existente->cantidad_almacen += $cantidad_a_traspasar;
            $producto_existente->update();
        } else {
            // Si no existe, crear un nuevo producto en el nuevo almacén
            $producto_existente = new AlmacenProducto;
            $producto_existente->nombre_almacen = $request->get('nombre_almacen');
            $producto_existente->fecha_entrada = now();
            $producto_existente->cantidad_almacen = $cantidad_a_traspasar;
            $producto_existente->nombre_producto = $request->get('nombre_producto');
            $producto_existente->descripcion = $request->get('descripcion');
            $producto_existente->tipo = $request->get('tipo');
            $producto_existente->presentacion = $request->get('presentacion');
            $producto_existente->precio_venta = $request->get('precio_venta');
            $producto_existente->unidad_medida = $request->get('unidad_medida');
            $producto_existente->fecha_fabricacion = $request->get('fecha_fabricacion');
            $producto_existente->fecha_vencimiento = $request->get('fecha_vencimiento');
            $producto_existente->cantidad_almacen = $request->get('cantidad_almacen');
            $producto_existente->codigo = $request->get('codigo');

            $producto_existente->save();
        }

        // Reducir la cantidad del producto en el almacén anterior
        $almacenProducto->cantidad_almacen -= $cantidad_a_traspasar;

        // Si la cantidad del producto en el almacén anterior es cero, eliminar el producto
        if ($almacenProducto->cantidad_almacen == 0) {
            $almacenProducto->delete();
        } else {
            $almacenProducto->update();
        }

        return Redirect::to('almacen/almacenes')->with('status', 'Producto Traspasado con éxito.');
    }

    public function update(AlmacenFormRequest $request, $id)
    {
        $almacen = Almacen::findOrfail($id);
        $almacen->almacen = $request->get('almacen');
        $almacen->nivel = $request->get('nivel');
        $almacen->sucursal = $request->get('sucursal');
        $almacen->ubicacion = $request->get('ubicacion');
        $almacen->update();

        session::flash('statuscode', 'success');

        return Redirect::to('almacen/almacenes')->with('status', 'Almacen actualizado con éxito.');
    }

    public function destroy($id)
    {
        $almacen = Almacen::find($id);
        $almacen->delete();

        session::flash('statuscode', 'success');

        return Redirect::to('almacen/almacenes')->with('status', 'Almacen eliminado con éxito.');
    }
}