<?php

namespace App\Http\Controllers;

use App\Http\Requests\InventarioRequest;
use App\Models\Categoria;
use App\Models\Departamento;
use App\Models\Inventario;
use App\Models\Proveedor;
use App\Models\TipoImpuesto;
use App\Models\Unidad;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;

class InventarioController extends Controller
{
    public function index(): View
    {
        $items = Inventario::with(['categoria', 'departamento', 'unidad', 'tipoImpuesto'])
            ->orderBy('nombre')
            ->paginate(15);

        return view('inventario.index', compact('items'));
    }

    public function create(): View
    {
        return view('inventario.create', $this->catalogos());
    }

    public function store(InventarioRequest $request): RedirectResponse
    {
        $data = $request->safe()->except('foto');

        if ($request->hasFile('foto')) {
            $data['foto_path'] = $request->file('foto')->store('productos', 'public');
        }

        Inventario::create($data);

        return redirect()->route('inventario.index')->with('status', 'Producto registrado correctamente.');
    }

    public function edit(Inventario $inventario): View
    {
        return view('inventario.edit', array_merge(['inventario' => $inventario], $this->catalogos()));
    }

    public function update(InventarioRequest $request, Inventario $inventario): RedirectResponse
    {
        $data = $request->safe()->except('foto');

        if ($request->hasFile('foto')) {
            if ($inventario->foto_path) {
                Storage::disk('public')->delete($inventario->foto_path);
            }
            $data['foto_path'] = $request->file('foto')->store('productos', 'public');
        }

        $inventario->update($data);

        return redirect()->route('inventario.index')->with('status', 'Producto actualizado correctamente.');
    }

    public function toggle(Inventario $inventario): RedirectResponse
    {
        $inventario->update(['active' => ! $inventario->active]);

        return redirect()->route('inventario.index')->with('status', 'Estado del producto actualizado.');
    }

    private function catalogos(): array
    {
        return [
            'categorias' => Categoria::where('active', true)->orderBy('nombre')->get(),
            'departamentos' => Departamento::where('active', true)->orderBy('nombre')->get(),
            'unidades' => Unidad::where('active', true)->orderBy('descripcion')->get(),
            'proveedores' => Proveedor::where('active', true)->orderBy('nombre')->get(),
            'tiposImpuesto' => TipoImpuesto::where('activo', true)->orderBy('nombre')->get(),
        ];
    }
}
