<?php

namespace App\Http\Controllers;

use App\Models\Producto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ProductoController extends Controller
{
    public function index()
    {
        $user = auth()->user();

        if ($user->hasRole('super-admin')) {
            $productos = Producto::latest()->get();
        } else {
            $productos = Producto::where('company_id', $user->company_id)
                ->latest()
                ->get();
        }

        return view('productos.index', compact('productos'));
    }

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

    public function store(Request $request)
    {
        $request->validate([
            'nombre' => 'required|string|max:255',
            'precio' => 'required|numeric|min:0',
            'descripcion' => 'nullable|string',
            'codigo_barras' => 'nullable|unique:productos,codigo_barras',
            'foto' => 'nullable|image|max:2048',
        ]);

        $data = $request->only([
            'nombre',
            'precio',
            'descripcion',
            'codigo_barras',
        ]);

        // Asignamos empresa del usuario autenticado
        $data['company_id'] = auth()->user()->company_id;

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

        // 👉 Guardamos en variable para auditar
        $producto = Producto::create($data);

        // ✅ AUDITORÍA DE CREACIÓN
        audit_log(
            'created-gitea',
            'productos',
            $producto,
            null,
            $producto->toArray()
        );

        return redirect()->route('productos.index')
            ->with('success', 'Producto creado correctamente.');
    }

    public function edit(Producto $producto)
    {
        $this->authorizeProducto($producto);

        return view('productos.edit', compact('producto'));
    }
public function update(Request $request, Producto $producto)
{
    $this->authorizeProducto($producto);

    $request->validate([
        'nombre' => 'required|string|max:255',
        'precio' => 'required|numeric|min:0',
        'descripcion' => 'nullable|string',
        'codigo_barras' => 'nullable|unique:productos,codigo_barras,' . $producto->id,
        'foto' => 'nullable|image|max:2048',
    ]);

    // 👉 Capturamos estado anterior (para auditoría)
    $oldData = $producto->toArray();

    $data = $request->only([
        'nombre',
        'precio',
        'descripcion',
        'codigo_barras',
    ]);

    if ($request->hasFile('foto')) {
        if ($producto->foto) {
            Storage::disk('public')->delete($producto->foto);
        }

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

    // 👉 ESTA LÍNEA ES LA CLAVE: actualiza con el array completo
    $producto->update($data);

    // 👉 Capturamos estado nuevo
    $newData = $producto->fresh()->toArray();

    // Auditoría
    audit_log(
        'updated',
        'productos',
        $producto,
        $oldData,
        $newData
    );

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

    public function destroy(Producto $producto)
    {
        $this->authorizeProducto($producto);

        $deletedData = $producto->toArray();

        if ($producto->foto) {
            Storage::disk('public')->delete($producto->foto);
        }

        $producto->delete();

        // ✅ AUDITORÍA DE ELIMINACIÓN
        audit_log(
            'deleted',
            'productos',
            $producto,
            $deletedData,
            null
        );

        return redirect()->route('productos.index')
            ->with('success', 'Producto eliminado.');
    }

    /**
     * Seguridad multiempresa (igual lógica que usas en otros módulos)
     */
    private function authorizeProducto(Producto $producto)
    {
        $user = auth()->user();

        if (
            !$user->hasRole('super-admin') &&
            $producto->company_id !== $user->company_id
        ) {
            abort(403, 'No autorizado.');
        }
    }
}
