<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

class requerimientos extends Model
{
    protected $fillable = [
        'titulo','descripcion','aplicacion_id','modulo_id','formulario_id','prioridad','estado','tipo','creador'
    ];

    // Mostrar todos los requerimientos al admin
    static function RequirementsAdmin() {
        return DB::table('requerimientos')
            ->join('aplicacion', 'aplicacion.id',  'requerimientos.aplicacion_id')
                ->join('users', 'users.id',  'requerimientos.creador')
                ->leftJoin('historial_requerimientos','historial_requerimientos.id_requerimiento', 'requerimientos.id')
                ->leftJoin('requerimientos_desarrolladores', 'requerimientos_desarrolladores.requerimiento_id',  'requerimientos.id')
                ->leftJoin('modulos', 'modulos.id',  'requerimientos.modulo_id')
                ->leftJoin('formularios', 'formularios.id',  'requerimientos.formulario_id')
                ->select('requerimientos.*', 'aplicacion.nombre as app_name','modulos.nombre as modulo_name','formularios.nombre as formulario_name','users.name as creador_name', DB::raw("count(requerimientos_desarrolladores.desarrollador_id) as devs"))
                ->groupBy('requerimientos.id','requerimientos.titulo','requerimientos.descripcion','requerimientos.aplicacion_id','requerimientos.modulo_id','requerimientos.formulario_id','requerimientos.estado','requerimientos.razon','requerimientos.prioridad','requerimientos.tipo','requerimientos.creador','requerimientos.TiempoAproximado','requerimientos.created_at','requerimientos.updated_at',
                'aplicacion.nombre','modulos.nombre','formularios.nombre','users.name')
                ->orderByRaw("FIELD(requerimientos.estado, \"RECHAZADO\",\"REALIZADO\", \"PROCESO\", \"PENDIENTE\", \"APROBADO\")")->orderBy('id', 'desc')
                ->paginate(10);
    }
    // Retornar la informacion del requerimiento junto con el nombre de la aplicacion, modulo y formulario
        // Hay un force para saber si el formulario viene nulo
            // view Show requerimiento
    static function RequeriminetoInfo($id) {
        $RequeriminetoInfo = DB::table('requerimientos')
        ->where('requerimientos.id',$id)
            ->join('aplicacion','aplicacion.id','requerimientos.aplicacion_id')
            ->join('modulos','modulos.id','requerimientos.modulo_id');
            $result  = $RequeriminetoInfo->get();
            if($result[0]->formulario_id == null){
                return $RequeriminetoInfo->select('requerimientos.*','aplicacion.nombre as app_name','modulos.nombre as modulo_name')
                ->first(); 
            }else{
                return $RequeriminetoInfo->join('formularios','formularios.id','requerimientos.formulario_id')
                ->select('requerimientos.*','aplicacion.nombre as app_name','modulos.nombre as modulo_name','formularios.nombre as form_name')
                ->first();
            }
    }
    // Mostrar los requerimientos asignados al desarrollador
    static function RequirementsDeveloper(){
        return DB::table('requerimientos')
            ->join('requerimientos_desarrolladores', 'requerimientos_desarrolladores.requerimiento_id', 'requerimientos.id')
            ->join('aplicacion', 'aplicacion.id',  'requerimientos.aplicacion_id')
            ->leftJoin('modulos', 'modulos.id',  'requerimientos.modulo_id')
            ->leftJoin('formularios', 'formularios.id',  'requerimientos.formulario_id')
            ->select('requerimientos.*', 'aplicacion.nombre as app_name','modulos.nombre as modulo_name','formularios.nombre as formulario_name')
            ->join('users', function ($join) {
                $join->on('users.id', 'requerimientos_desarrolladores.desarrollador_id');
                $join->where('users.role', 'desarrollador');
                $join->where('users.id', Auth::user()->id);
        })->orderByRaw('id DESC')->paginate(10);
    }
    // Mostrar los requerimientos creados por el cliente
    static function RequirementsCustomer () {
        return DB::table('requerimientos')
            ->join('aplicacion', 'aplicacion.id','requerimientos.aplicacion_id')
            ->leftJoin('usuarios_app', 'usuarios_app.app_id',  'requerimientos.aplicacion_id')
            ->leftJoin('modulos', 'modulos.id',  'requerimientos.modulo_id')
            ->join('users', 'users.id',  'requerimientos.creador')
            ->leftJoin('formularios', 'formularios.id',  'requerimientos.formulario_id')
            ->select('requerimientos.*', 'aplicacion.nombre as app_name','modulos.nombre as modulo_name','formularios.nombre as formulario_name')
            ->where('usuarios_app.user_id', Auth::user()->id)
            ->orderByRaw('id DESC')
            ->paginate(10);
    }
    
    // Filtrar los requerimientos por el id de la aplicacion
    static function mostrarPorAppId($idApp) {
        return DB::table('requerimientos')
            ->join('aplicacion', 'aplicacion.id',  'requerimientos.aplicacion_id')
                ->join('users', 'users.id',  'requerimientos.creador')
                ->leftJoin('modulos', 'modulos.id',  'requerimientos.modulo_id')
                ->leftJoin('requerimientos_desarrolladores', 'requerimientos_desarrolladores.requerimiento_id',  'requerimientos.id')
                ->leftJoin('formularios', 'formularios.id',  'requerimientos.formulario_id')
                ->select('requerimientos.*', 'aplicacion.nombre as app_name','modulos.nombre as modulo_name','formularios.nombre as formulario_name','users.name as creador_name', DB::raw("count(requerimientos_desarrolladores.desarrollador_id) as devs"))
                ->groupBy('requerimientos.id','requerimientos.titulo','requerimientos.descripcion','requerimientos.aplicacion_id','requerimientos.modulo_id','requerimientos.formulario_id','requerimientos.estado','requerimientos.razon','requerimientos.prioridad','requerimientos.tipo','requerimientos.creador','requerimientos.TiempoAproximado','requerimientos.created_at','requerimientos.updated_at',
                'aplicacion.nombre','modulos.nombre','formularios.nombre','users.name')
                ->where('requerimientos.aplicacion_id',$idApp)->orderBy('id', 'desc')->paginate(10);
    }

    
    // Recibir requerimiento
    public static function recibir($id, $estado) {
        if($estado == 'PENDIENTE' && Auth::user()->role == 'admin') {
            $requerimiento = requerimientos::find($id);
            $requerimiento->estado ='CONFIRMADO';
            $requerimiento->update();
            
            historial_requerimiento::create([
                'id_requerimiento' => $id,
                'estado_requerimiento' => 'CONFIRMADO',
            ]);
        }
    }
}
