<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Producto;
use Illuminate\Http\Request;
use App\Filtros\FiltroDeSubpedido;
use App\Subpedido;
use App\GrupoDeCompra;
use App\Http\Resources\SubpedidoResource;
use Illuminate\Validation\Rule;
use Symfony\Component\HttpKernel\Exception\HttpException;


class SubpedidoController extends Controller
{
    /**
     * Mostrar una lista de productos.
     *
     * @param App\Filtros\FiltroDeSubpedido $filtros
     * @param \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function index(FiltroDeSubpedido $filtros, Request $request)
    {
        return Subpedido::filtrar($filtros)->get();
    }

    public function indexResources(FiltroDeSubpedido $filtros, Request $request)
    {
        return SubpedidoResource::collection(Subpedido::filtrar($filtros)->get());
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request  $request)
    {
        $validado = $this->validateSubpedido();
        if (Subpedido::where("nombre",$validado["nombre"])->where("grupo_de_compra_id",$validado["grupo_de_compra_id"])->get()->count()) {
            throw new HttpException(400, "Ya existe un subpedido con este nombre");
        }
        $s = new Subpedido();
        $s->nombre = $validado["nombre"];
        $s->grupo_de_compra_id = $validado["grupo_de_compra_id"];
        $s->save();
        return $s;
    }

    protected function validateSubpedido(){
        return request()->validate([
            'nombre'                => 'required|max:255',
            'grupo_de_compra_id'    => [
                'required',
                Rule::in(GrupoDeCompra::all()->pluck('id')),
            ]
        ]);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Subpedido  $subpedido
     * @return \Illuminate\Http\Response
     */
    public function show(Subpedido $subpedido)
    {
        return new SubpedidoResource($subpedido);
    }

    // recibe request, saca producto y cantidad, valida, y pasa a syncProducto en Subpedido
    public function syncProductos(Subpedido $subpedido) {
        $valid = request()->validate([
            'cantidad'              => 'required|min:0',
            'producto_id'    => [
                'required',
                Rule::in(Producto::all()->pluck('id')),
            ]
        ]);

        $producto = Producto::find($valid['producto_id']);

        $subpedido->syncProducto($producto, $valid['cantidad']);
        return new SubpedidoResource($subpedido);
    }

    public function toggleAprobacion(Subpedido $subpedido) {
        $valid = request()->validate([
            'aprobacion' => 'required | boolean'
        ]);
        $subpedido->toggleAprobacion($valid['aprobacion']);
        return new SubpedidoResource($subpedido);
    }

}