<?php

namespace App\Http\Controllers;

use App\PeticionMaterial;
use App\User;
use App\Materiales;
use App\Personal;
use App\DetallePeticion;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Carbon;
use Barryvdh\DomPDF\Facade as PDF;
use Illuminate\Support\Facades\Auth;

class PeticionMaterialController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    public function index()
    {
        if(Auth::user()->user_tipe == 'Admin' || Auth::user()->user_tipe == 'Bodeguista')
        {
            $datos = DB::table('peticion_materials')
            ->join('personals', 'personals.id_personal', '=', 'peticion_materials.id_personal')
            ->select('peticion_materials.id_peticion', 'personals.nombre', 'personals.apellidos',
            'peticion_materials.fecha_peticion', 'peticion_materials.observaciones')
            ->orderBy('personals.id_personal', 'asc')
            ->paginate(20);
            return view('PeticionMaterial.index', compact('datos'));
        }
        else
        {
            abort(403, 'Acceso Prohibido');
        }
    }

    public function search(Request $request)
    {
        if(Auth::user()->user_tipe == 'Admin' || Auth::user()->user_tipe == 'Bodeguista')
        {
            $search = trim($request->get('search'));
            
            $datos = DB::table('peticion_materials')
            ->join('personals', 'personals.id_personal', '=', 'peticion_materials.id_personal')
            ->select('peticion_materials.id_peticion', 'personals.nombre', 'personals.apellidos',
            'peticion_materials.fecha_peticion', 'peticion_materials.observaciones')
            ->where('nombre', 'LIKE', '%'.$search.'%')
            ->orWhere('apellidos', 'LIKE', '%'.$search.'%')
            ->orWhere('fecha_peticion', 'LIKE', '%'.$search.'%')
            ->orderBy('id_peticion', 'asc')->paginate();

            $output = '';

            if(count($datos)>0)
            {
                $contador = 1;
                foreach($datos as $dato)
                {
                    $output .= '<tr style="text-align: center">
                                    <td>'.$contador.'</td>
                                    <td>'.$dato->nombre." ".$dato->apellidos.'</td>
                                    <td>'.Carbon::parse($dato->fecha_peticion)->format('d-m-Y').'</td>
                                    <td>'.$dato->observaciones.'</td>
                                    <td>
                                        <form method="post" action="PeticionMaterial/'.$dato->id_peticion.' " style="display: inline">
                                            '.csrf_field().'
                                            '.method_field("DELETE").'
                                            <button type="submit" onclick="return confirm("¿Seguro Que Desea Eliminar esta Peticion de Blacklist?");" class="btn btn-primary">
                                                <span class="fas fa-user-times"></span> Quitar</button>
                                        </form>
                                    </td>
                                </tr>';
                    $contador = $contador + 1; 
                }
                return response($output);
            }
            else
            {
                $output .= '<tr><td colspan="5" style="text-align: center">¡Ups..! No Se Encontraron Resultados</td></tr>';
                return response($output);
            }
        }
        else
        {
            abort(403, 'Acceso Prohibido');
        }
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {

    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\PeticionMaterial  $peticionMaterial
     * @return \Illuminate\Http\Response
     */
    public function show(PeticionMaterial $peticionMaterial)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\PeticionMaterial  $peticionMaterial
     * @return \Illuminate\Http\Response
     */
    public function edit(PeticionMaterial $peticionMaterial)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\PeticionMaterial  $peticionMaterial
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, PeticionMaterial $peticionMaterial)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\PeticionMaterial  $peticionMaterial
     * @return \Illuminate\Http\Response
     */
    public function destroy($id_peticion)
    {
        if(Auth::user()->user_tipe == 'Admin' || Auth::user()->user_tipe == 'Bodeguista')
        {
            PeticionMaterial::destroy($id_peticion);
            return redirect('PeticionMaterial')->with('Mensaje','¡Personal Eliminado de Blacklist Correctamente!');
        }
        else
        {
            abort(403, 'Acceso Prohibido');
        }
    }



    //YA
    public function terminarOCancelarPeticion(Request $request)
    {
        if(Auth::user()->user_tipe == 'Admin' || Auth::user()->user_tipe == 'Bodeguista')
        {
            if ($request->input("accion") == "terminar")
            {
                return $this->terminarPeticion($request);
            } 
            else
            {
                return $this->cancelarPeticion();
            }
        }
        else
        {
            abort(403, 'Acceso Prohibido');
        }
    }

    //YA
    public function terminarPeticion(Request $request)
    {
        // Crear una peticion
        $peticion = new PeticionMaterial();
        $peticion->id_personal = $request->input('id_personal');
        $peticion->fecha_peticion = $request->input('fecha_peticion');
        $peticion->observaciones = $request->input('observaciones');

        //Validacion
        $campos = [
            'id_personal' => 'required',
            'fecha_peticion' => 'required',
        ];

        $MensajeVal = ["required" => 'El Campo :attribute Es Requerido'];
        $this->validate($request, $campos, $MensajeVal);

        //CONDICIONANDO PETICION CON FECHA
        $peticiones = PeticionMaterial::get(['id_personal', 'fecha_peticion']);
        foreach($peticiones as $pet)
        {
            if ($pet['id_personal'] == $peticion->id_personal)
            {
                $fecha1 = date_create($pet['fecha_peticion']);
                $fecha2 = date_create($peticion->fecha_peticion);
                $intervalo = date_diff($fecha1, $fecha2);
                if($intervalo->format('%a') >= 15)
                {
                    return redirect()->route('peticion.index')->with('Mensaje', 'No Puedes Pedir Mas Material, Debes entregar Lo Anterior Pedido');
                }
            }
        }

        $peticion->saveOrFail(); //Guarda el modelo mediante transaccion

        $idPeticion = $peticion->id_peticion;
        $materiales = $this->obtenerMateriales();

        // Recorrer carrito de pedidos
        foreach ($materiales as $material)
        {
            // El producto que se pide
            $materialPedido = new DetallePeticion();
            $materialPedido->fill([
                "id_peticion" => $idPeticion,
                "id_material" => $material->id_material,
                "cantidadP" => $material->cantidadP,
                "total" => $material->cantidadP * $material->precio
            ]);

            // Lo guardamos
            $materialPedido->saveOrFail();

            // Y restamos la existencia del original
            $materialActualizado = Materiales::find($material->id_material);
            $materialActualizado->cantidad -= $materialPedido->cantidadP;
            $materialActualizado->saveOrFail();
        }

        $this->vaciarMateriales();
        //return redirect()->route('peticion.index')->with("Mensaje", "Pedido Realizado");

        $datosPeticion = DB::table('detalle_peticions')
        ->join('materiales', 'materiales.id_material', '=', 'detalle_peticions.id_material')
        ->select(['detalle_peticions.id_peticion', 'materiales.id_material', 'materiales.nombre',
        'detalle_peticions.cantidadP', 'detalle_peticions.total'])
        ->where('detalle_peticions.id_peticion', '=', $materialPedido['id_peticion'])
        ->get();

        $usuario = Auth::user()->name;

        $pdf = PDF::loadView('Reportes.TicketDePeticion', compact(['datosPeticion', 'materialPedido', 'usuario']));
        return $pdf->stream('Ticket-pedido-'.date('Y-m-d').'.pdf');
    }

    //YA
    private function obtenerMateriales()
    {
        $materiales = Session('materiales');
        if (!$materiales) 
        {
            $materiales = [];
        }
        return $materiales;
    }

    //YA
    private function vaciarMateriales()
    {
        $this->guardarMateriales(null);
    }

    //YA
    private function guardarMateriales($materiales)
    {
        Session(['materiales' => $materiales,
        ]); 
    }

    //YA
    public function cancelarPeticion()
    {
        $this->vaciarMateriales();
        return redirect()->route('peticion.index')->with("Mensaje", "Peticion Cancelada"); //VERIFICAR RUTA
    }

    //YA
    public function quitarMaterialDePeticion(Request $request)
    {
        $indice = $request->post('indice');
        $materiales = $this->obtenerMateriales();

        array_splice($materiales, $indice, 1); //array_splice — Elimina una porción del array y la reemplaza con otra cosa
        $this->guardarMateriales($materiales);

        return redirect()->route('peticion.index'); //VERIFICAR RUTA
    }

    //YA
    public function agregarMaterialPeticion(Request $request)
    {
        //return response()->json($material);
        
        $codigo = $request->post('codigo');
        $material = Materiales::where("codigo", "=", $codigo)->first();

        if (!$material)
        {
            return redirect()->route('peticion.index')->with("Mensaje", "Material No Encontrado"); //VERIFICAR RUTA
        }

        $this->agregarMaterialACarrito($material);
        return redirect()->route('peticion.index'); //VERIFICAR RUTA
    }
    
    private function agregarMaterialACarrito($material)
    {
        if ($material->cantidad <= 0)
        {
            return redirect()->route('peticion.index')
            ->with(["Mensaje" => "No Hay Existencias Del Material", "tipo" => "danger"]); //VERIFICAR RUTA
        }

        $materiales = $this->obtenerMateriales();
        $posibleIndice = $this->buscarIndiceDeMaterial($material->codigo, $materiales);
        // Es decir, producto no fue encontrado

        if ($posibleIndice === -1)
        {
            $material->cantidadP = 1;
            array_push($materiales, $material); //inserta uno o mas elementos al final del array
        }
        else
        {
            if ($materiales[$posibleIndice]->cantidadP + 1 > $material->cantidad) 
            {
                return redirect()->route('peticion.index')
                ->with(["Mensaje" => "No Se Pueden Agregar Más Materiales De Este Tipo, Se Quedarían Sin Existencia",
                "tipo" => "danger"]);
            }

            $materiales[$posibleIndice]->cantidadP++;
        }

        $this->guardarMateriales($materiales);
    }

    function buscarIndiceDeMaterial($codigo, $materiales)
    {
        foreach ($materiales as $indice => $material) 
        {
            if ($material->codigo === $codigo)
            {
                return $indice;
            }
        }

        return -1;
    }

    public function indexPeticion()
    {
        if(Auth::user()->user_tipe == 'Admin' || Auth::user()->user_tipe == 'Bodeguista' || Auth::user()->user_tipe == 'Capataz')
        {
            $personales = Personal::all();
            return view('PeticionMaterial.create', compact('personales'));
        }
        else
        {
            abort(403, 'Acceso Prohibido');
        }
    }
}
