<?php

namespace App\Http\Controllers;

use App\Models\Categoria;
use Illuminate\Database\QueryException;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class CategoriaController extends Controller
{
    public function index(): View
    {
        $empresaId = tenant_empresa_id();
        abort_if(! $empresaId, 403, 'No hay empresa activa.');

        $categorias = Categoria::query()
            ->where('empresa_id', $empresaId)
            ->orderByDesc('id')
            ->get();

        return view('modules.categorias.index', [
            'categorias' => $categorias,
        ]);
    }

    public function store(Request $request): RedirectResponse
    {
        $empresaId = tenant_empresa_id();
        abort_if(! $empresaId, 403, 'No hay empresa activa.');

        $validated = $request->validate([
            'nombre' => ['required', 'string', 'max:120'],
            'descripcion' => ['nullable', 'string', 'max:255'],
            'activo' => ['nullable', 'boolean'],
        ]);

        Categoria::query()->create([
            'empresa_id' => $empresaId,
            'nombre' => $validated['nombre'],
            'descripcion' => $validated['descripcion'] ?? null,
            'activo' => $request->boolean('activo', true),
        ]);

        return redirect()->route('categorias.index')
            ->with('status', 'Categoria creada correctamente.');
    }

    public function edit(Categoria $categoria): View
    {
        $this->ensureCategoriaAccess($categoria);

        return view('modules.categorias.edit', [
            'categoria' => $categoria,
        ]);
    }

    public function update(Request $request, Categoria $categoria): RedirectResponse
    {
        $this->ensureCategoriaAccess($categoria);

        $validated = $request->validate([
            'nombre' => ['required', 'string', 'max:120'],
            'descripcion' => ['nullable', 'string', 'max:255'],
            'activo' => ['nullable', 'boolean'],
        ]);

        $categoria->update([
            'nombre' => $validated['nombre'],
            'descripcion' => $validated['descripcion'] ?? null,
            'activo' => $request->boolean('activo'),
        ]);

        return redirect()->route('categorias.index')
            ->with('status', 'Categoria actualizada correctamente.');
    }

    public function deactivate(Categoria $categoria): RedirectResponse
    {
        $this->ensureCategoriaAccess($categoria);

        if (! $categoria->activo) {
            return redirect()->route('categorias.index')
                ->with('status', 'La categoria ya estaba desactivada.');
        }

        $categoria->update(['activo' => false]);

        return redirect()->route('categorias.index')
            ->with('status', 'Categoria desactivada correctamente.');
    }

    public function reactivate(Categoria $categoria): RedirectResponse
    {
        $this->ensureCategoriaAccess($categoria);

        if ($categoria->activo) {
            return redirect()->route('categorias.index')
                ->with('status', 'La categoria ya estaba activa.');
        }

        $categoria->update(['activo' => true]);

        return redirect()->route('categorias.index')
            ->with('status', 'Categoria reactivada correctamente.');
    }

    public function destroy(Categoria $categoria): RedirectResponse
    {
        $this->ensureCategoriaAccess($categoria);

        try {
            $categoria->delete();

            return redirect()->route('categorias.index')
                ->with('status', 'Categoria eliminada correctamente.');
        } catch (QueryException) {
            return redirect()->route('categorias.index')
                ->with('error', 'No se pudo eliminar la categoria porque tiene productos relacionados.');
        }
    }

    private function ensureCategoriaAccess(Categoria $categoria): void
    {
        abort_unless((int) $categoria->empresa_id === (int) tenant_empresa_id(), 403, 'No tienes acceso a esta categoria.');
    }
}
