<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\modulos;
use App\users;
use App\aplicacion;
use App\requerimientos;
use App\requerimientos_desarrolladores;
use App\comentarios_requerimientos;
use App\usuarios_app;
use App\historial_requerimiento;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class requerimientosController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index($app = null)
    {
        // Filtrar requerimientos por el usuario logueado
        $requerimientos = null;
        switch (Auth::user()->role) {
            case 'admin':
                $requerimientos = requerimientos::RequirementsAdmin();
                if($app != null) {
                    $requerimientos = requerimientos::mostrarPorAppId($app);
                }
                break;
            case 'cliente':
                $requerimientos = requerimientos::RequirementsCustomer();
                break;
            case 'desarrollador':
                $requerimientos = requerimientos::RequirementsDeveloper();
                break;
        }
        // Obtener aplicaciones para el filtro del administrador
        $aplicaciones = aplicacion::all();
        return view('requerimientos.requerimientos',[
            'aplicaciones' => $aplicaciones,
            'requerimientos' => $requerimientos
        ]);
    }

    // Filtrar los requerimientos por el id de la aplicacion
    public function mostrarPorApp($idApp) {
        $requerimientos_Admin = requerimientos::mostrarPorAppId($idApp);
        return json_encode($requerimientos_Admin);
    }

    // Mostrar el requerimiento seleccionado
    public function show($id)
    {
        $requerimientos_desarrolladores = requerimientos_desarrolladores::AssignedDevelopers($id);
        
        $aplicacionesUsuario = usuarios_app::app_user();
        $historial_requerimientos = DB::table('historial_requerimientos')
            ->where('id_requerimiento', $id)
            ->get();
        $requerimientoExistente = requerimientos::find($id);
        if(!$requerimientoExistente || $requerimientoExistente->creador != Auth::user()->id && Auth::user()->role == 'cliente') {
            return redirect('error');
        }else{
            $requerimiento = requerimientos::RequeriminetoInfo($id);
        }
        // Comentarios del requerimiento
        $comentarios = comentarios_requerimientos::listaComentarios($id);
        return view('requerimientos.Requerimiento',[
            'requerimiento' => $requerimiento,
            'aplicacionesUsuario' => $aplicacionesUsuario,
            'requerimientos_desarrolladores' => $requerimientos_desarrolladores,
            'historial_requerimientos' => $historial_requerimientos,
            'comentarios' => $comentarios
        ]);
    }
    
    // vista de crear requerimientos con las aplicaciones que tiene asignado el usuario
    public function create() {
        $aplicaciones = usuarios_app::app_user();
        $HistorialId= DB::table('requerimientos')->max('id');
        return view('requerimientos.agregarRequerimiento',[
            'aplicaciones' => $aplicaciones,
            'HistorialId' => $HistorialId+1
        ]);
    }

    // Filtrar modulos que pertenecen a la aplicacion seleccionada
    public function modulosRelacionados($id) {
        $modulos = DB::table('modulos')->where('aplicacion_id', '=', $id)->get();
        return json_encode($modulos);
    }

    // Filtrar formularios que pertenecen al modulo seleccionado
    public function FormulariosRelacionados($id) {
        $formularios = DB::table('formularios')->where('modulo_id', '=', $id)->get();
        return json_encode($formularios);
    }

    // Guardar requerimiento enviado por el formulario a la base de datos
    public function store(Request $request)
    {
        $request->validate([
            'HistorialId' => 'required|numeric',
            'titulo' => 'required',
            'descripcion' => 'required',
            'prioridad' => 'required',
            'tipo' => 'required',
        ]);
        // Retornar a la vista de error si el campo descripcion vacio
        if( !is_null($request->input('descripcion')) &&  is_numeric($request->input('modulo'))) {
            requerimientos::create([
                'titulo' => $request['titulo'],
                'descripcion' => $request['descripcion'],
                'aplicacion_id' => $request['aplicacion'],
                'creador' => $request['creador'],
                'modulo_id' => ($request['modulo'] != null) ? $request['modulo'] : null,
                'formulario_id' => ($request['formulario'] != null) ? $request['formulario'] : null,
                'prioridad' => $request['prioridad'],
                'tipo' => $request['tipo'],
                'estado' => 'pendiente',
            ]);

            return redirect('requerimientos');
            
        }
        return redirect('error');
    }

    // Asignar un desarrollador al requerimiento
    public function asignar($id) 
    {
        $requerimiento = requerimientos::find($id);
        //buscar desarrolladores que pertenecen a la aplicacion
        $desarrolladoresDeLaAplicacion = users::AppDevReque($requerimiento->aplicacion_id, $requerimiento->id);
        // dump($desarrolladoresDeLaAplicacion);
        return view('requerimientos.asignarDesarrollador',[
            'desarrolladores' => $desarrolladoresDeLaAplicacion,
            'requerimiento' => $requerimiento
        ]);
    }

    // Guardar desarrollador asignado en la base de datos
    public function asignarDesarrollador(Request $request, $id) 
    {
        if( empty($request['desarrollador']) == null) {
            requerimientos_desarrolladores::create([
                'desarrollador_id' => $request['desarrollador'],
                'requerimiento_id' => $request['requerimiento']
            ]);
            return redirect('requerimientos');
            
        }
        return redirect('error');
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    // Actualizar el requerimiento en la base de datos
    public function update(Request $request, $id)
    {
        // Validar que los campos descripcion y modulo no estan vacios
        if( !is_null($request->input('descripcion')) && !is_null($request->input('titulo')) &&  is_numeric($request->input('modulo'))) {
            $requerimiento = requerimientos::find($id);
            $requerimiento->titulo =$request->titulo;
            $requerimiento->descripcion =$request->descripcion;
            $requerimiento->aplicacion_id =$request->aplicacion;
            $requerimiento->modulo_id =$request->modulo;
            $requerimiento->formulario_id =$request->formulario;
            $requerimiento->prioridad =$request->prioridad;
            $requerimiento->tipo =$request->tipo;
            $requerimiento->update();
        return redirect('requerimiento/'.$id);
        }
        return redirect('error');
    }

    // Actualizar el estado del requerimiento
    public function actualizarestado(Request $request, $id)
    {
        if($request->estado == 'INCOMPLETO') {
            $request->validate([
                'estado' => 'required',
                'razon' => 'required',
            ]);
        }
        $requerimiento = requerimientos::find($id);
        $requerimiento->razon = ($request['razon'] != null) ? $request['razon'] : null;
        $requerimiento->estado =$request->estado;
        $requerimiento->TiempoAproximado =$request->TiempoAproximado;
        $requerimiento->update();
        
        // Crear historial del requerimiento
        historial_requerimiento::create([
            'id_requerimiento' => $id,
            'estado_requerimiento' => $request['estado'],
            'razon' => ($request['razon'] != null) ? $request['razon'] : null
        ]);
        return redirect('requerimiento/'.$id);
    }
    // Agregar un comentario al requerimiento
    function AgregarComentario(Request $request, $id) {
        comentarios_requerimientos::create([
            'requerimiento_id' => $id,
            'usuario' => Auth::user()->id,
            'contenido' => $request['contenido']
        ]);
        return redirect('requerimiento/'.$id);
    }
    // Eliminar el requerimiento en la base de datos
    public function destroy($id)
    {
        requerimientos::destroy($id);
        return redirect('requerimientos');
    }
    public function destroydeveloperRequirement($id)
    {
        requerimientos_desarrolladores::destroy($id);
    }

    public function eliminarComentario($id) {
        comentarios_requerimientos::destroy($id);
    }
}
