<?php

namespace App\Http\Controllers;

use App\Models\{Receta, Insumo};
use App\Http\Requests\RecetaRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class RecetaController extends Controller
{
    public function index(Request $request)
    {
        $recetas = Receta::with(['ingredientes.insumo'])
            ->when($request->search, fn($q) =>
                $q->where('nombre', 'like', "%{$request->search}%")
            )
            ->when($request->activa !== null, fn($q) => $q->where('activa', $request->activa))
            ->orderBy('nombre')
            ->paginate(25)
            ->withQueryString();

        $insumos = Insumo::activos()->orderBy('nombre')->get(['id', 'nombre', 'unidad_uso', 'costo_unitario']);

        return view('recetas.index', compact('recetas', 'insumos'));
    }



    public function store(RecetaRequest $request)
    {
        DB::transaction(function () use ($request) {
            $receta = Receta::create([
                ...$request->safe()->except('ingredientes'),
                'user_id' => auth()->id(),
            ]);

            foreach ($request->ingredientes as $ing) {
                $receta->ingredientes()->create([
                    'insumo_id' => $ing['insumo_id'],
                    'tipo'      => $ing['tipo'],
                    'cantidad'  => $ing['cantidad'],
                ]);
            }
        });

        return redirect()->route('recetas.index')
            ->with('success', 'Receta creada correctamente.');
    }

    public function show(Receta $receta)
    {
        $receta->load(['ingredientes.insumo', 'creadaPor']);
        return view('recetas.show', compact('receta'));
    }

    public function edit(Receta $receta)
    {
        $receta->load('ingredientes.insumo');
        $insumos = Insumo::activos()->orderBy('nombre')->get(['id', 'nombre', 'unidad_uso', 'costo_unitario']);
        return view('recetas.edit', compact('receta', 'insumos'));
    }

    public function update(RecetaRequest $request, Receta $receta)
    {
        DB::transaction(function () use ($request, $receta) {
            $receta->update($request->safe()->except('ingredientes'));

            // Sincronizar ingredientes: eliminar los viejos y recrear
            $receta->ingredientes()->delete();

            foreach ($request->ingredientes as $ing) {
                $receta->ingredientes()->create([
                    'insumo_id' => $ing['insumo_id'],
                    'tipo'      => $ing['tipo'],
                    'cantidad'  => $ing['cantidad'],
                ]);
            }

            // Invalidar caché del costo
            $receta->invalidarCacheCosto();
        });

        return redirect()->route('recetas.show', $receta)
            ->with('success', 'Receta actualizada correctamente.');
    }

    public function destroy(Receta $receta)
    {
        if ($receta->programaciones()->exists()) {
            return back()->withErrors(['error' =>
                'No se puede eliminar: la receta está en programaciones. Desactívala en su lugar.'
            ]);
        }

        $nombre = $receta->nombre;
        $receta->delete();

        return redirect()->route('recetas.index')
            ->with('success', "Receta \"{$nombre}\" eliminada.");
    }

    public function verificarNombre(Request $request)
    {
        $existe = Receta::where('nombre', $request->nombre)
            ->when($request->id, fn($q) => $q->where('id', '!=', $request->id))
            ->exists();

        return response()->json(['existe' => $existe]);
    }
}