<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\{InglesAlumnos, AlumnosAdmision, Periodo, Carreras, Configuracion, ConfiguracionNivel};
use App\Exports\NivelesInglesExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\DB;
use App\NGL_ResultadosUbicacion;

class InglesAlumnosController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $periodos = Periodo::where('id','>=', '5')->get();
        $carreras = Carreras::all();
        $confi = Configuracion::where('estado',1)->first();
        //$confi = Configuracion::orderBy('id','desc')->first();

        //Estos son los resultados de la ultima aplicacion del examen
        $resultados = NGL_ResultadosUbicacion::where('idConfi', $confi->id)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->whereNotNull('fecha')->orderBy('nivel')->get();
        
        $examen_no= NGL_ResultadosUbicacion::where('estadoIngles', 2)->where('idConfi', $confi->id)->where('fecha', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        
        $examen_si= NGL_ResultadosUbicacion::where('estadoIngles', 2)->where('idConfi', $confi->id)->where('fecha', '!=', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        
        $nivel = InglesAlumnos::where('estado', 1)->where('configuracion_id',$confi->id)->with('alumno.carrera')->whereNotIn('id', ['21', '290'])->get();
        $ids = InglesAlumnos::select('alumno_id')->where('configuracion_id',$confi->id)->get()->toArray();
        
        $no_contestaron = AlumnosAdmision::where('fk_idPeriodo', $confi->periodo_id)->where('pago', '1')->whereNotIn('idAlumnoAdmi', $ids)->with('carrera')->whereNotIn('idAlumnoAdmi', ['2410', '4282', '4341', '4830'])->get();
        
        return view('examen_ingles.reporte.principal', compact('resultados', 'examen_si', 'examen_no', 'nivel', 'no_contestaron', 'periodos', 'carreras'));
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function filtro(Request $request)
    {
        $data = $request->all();
        if ($data['filtro_periodo']!=null) {
            $confi = Configuracion::where('periodo_id', $data['filtro_periodo'])
                        ->where(function($query){ 
                            $query->orWhere('estado', '1')->orWhere('estado', '0'); 
                        })->select('id')->get()->toArray();
            $periodo = $data['filtro_periodo'];
        } else {
            $c = Configuracion::where('estado', 1)->first(); // para conocer el periodo mas actual
            $periodo = $c->periodo_id;            
            $confi = Configuracion::where('estado',1)->orWhere('estado', 0)->where('periodo_id', $c->periodo_id)->select('id')->get()->toArray();       //configuraciones que tiene ese periodo y son de examen de ubicacion de nuevo ingreso
        }
        
        $ids = InglesAlumnos::select('alumno_id')->whereIn('configuracion_id',$confi)->get()->toArray();
        if ($data['filtro_carrera']!=null || $data['filtro_nombre']!=null) {
            //Obtiene los alumnos de acuerdo al nivel en el que quedaron
            $resultados = NGL_ResultadosUbicacion::whereIn('idConfi', $confi)
                            ->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->whereNotNull('fecha');

            $examen_no= NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->where('fecha', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830']);
            
            $examen_si= NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->where('fecha', '!=', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830']);

            //Carrera
            if ($data['filtro_carrera']!=null) {
              $resultados= $resultados->where('fk_idCarrera', $data['filtro_carrera']);
              $examen_no = $examen_no->where( 'fk_idCarrera', $data['filtro_carrera']);
              $examen_si = $examen_si->where( 'fk_idCarrera', $data['filtro_carrera']);
            }

            //Nombre completo o numero de control
            if ($data['filtro_nombre']!=null) {
              $resultados = $resultados->where(function($query) use ($data){ 
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });

              $examen_no = $examen_no->where(function($query) use ($data){
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });

              $examen_si = $examen_si->where(function($query) use ($data){
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });
            }

            $resultados= $resultados->with('carrera')->orderBy('nivel')->get();
            $examen_no = $examen_no->with('carrera')->get();
            $examen_si = $examen_si->with('carrera')->get();
            
            $nivel = InglesAlumnos::where('estado', 1)->whereIn('configuracion_id',$confi)->whereHas('alumno',function($query)use($data){
                $query = $query->where('fk_idCarrera',$data['filtro_carrera']);
                $query = $query->with('carrera');
            })->whereNotIn('id', ['21', '290'])->get();
            $no_contestaron = AlumnosAdmision::where('fk_idCarrera',$data['filtro_carrera'])->where('fk_idPeriodo', $periodo)->where('pago', '1')->whereNotIn('idAlumnoAdmi', $ids)->whereNotIn('idAlumnoAdmi', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        } else {
            $resultados = NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->whereNotNull('fecha')->orderBy('nivel')->get();
            $examen_no= NGL_ResultadosUbicacion::where('estadoIngles', 2)->whereIn('idConfi', $confi)->where('fecha', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
            $examen_si= NGL_ResultadosUbicacion::where('estadoIngles', 2)->whereIn('idConfi', $confi)->where('fecha', '!=', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();            
            $nivel = InglesAlumnos::where('estado', 1)->whereIn('configuracion_id',$confi)->with('alumno.carrera')->whereNotIn('id', ['21', '290'])->get();
            $no_contestaron = AlumnosAdmision::where('fk_idPeriodo', $periodo)->where('pago', '1')->whereNotIn('idAlumnoAdmi', $ids)->whereNotIn('idAlumnoAdmi', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        }

        
        
        return view('examen_ingles.reporte.contenedor', compact('resultados', 'examen_si', 'examen_no', 'nivel', 'no_contestaron'));
    }


    /**
     * 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  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * 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
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

    public function exportar(Request $request){
        $data = $request->all();

        $resultados = NGL_ResultadosUbicacion::whereIn('estadoConfi', [0,1])
                            ->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])
                            ->whereNotNull('fecha');
        
        if ($data['filtro_periodo']!=null) {
            $resultados = $resultados->where('periodoExamen', $data['filtro_periodo']);
        }

        if ($data['filtro_carrera']!=null) {
            $resultados = $resultados->where('fk_idCarrera', $data['filtro_carrera']);
        }

        if ($data['filtro_nombre']) {
            $resultados = $resultados->where(function($query) use ($data){
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });
        }

        $resultados = $resultados->select('no_control', 'nombre_completo', 'fk_idCarrera', 'idNivel')->with('carrera')->get();

        return new NivelesInglesExport($resultados);
    }

    public function imprimir(Request $request){
        $data = $request->all();
        if ($data['filtro_periodo']!=null) {
            $confi = Configuracion::where('periodo_id', $data['filtro_periodo'])
                        ->where(function($query){ 
                            $query->orWhere('estado', '1')->orWhere('estado', '0'); 
                        })->select('id')->get()->toArray();
            $periodo = $data['filtro_periodo'];
        } else {
            $c = Configuracion::where('estado', 1)->first(); // para conocer el periodo mas actual
            $periodo = $c->periodo_id;            
            $confi = Configuracion::where('estado',1)->orWhere('estado', 0)->where('periodo_id', $c->periodo_id)->select('id')->get()->toArray();       //configuraciones que tiene ese periodo y son de examen de ubicacion de nuevo ingreso
        }
        
        $ids = InglesAlumnos::select('alumno_id')->whereIn('configuracion_id',$confi)->get()->toArray();
        if ($data['filtro_carrera']!=null || $data['filtro_nombre']!=null) {
            //Obtiene los alumnos de acuerdo al nivel en el que quedaron
            $resultados = NGL_ResultadosUbicacion::whereIn('idConfi', $confi)
                            ->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->whereNotNull('fecha');

            $examen_no= NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->where('fecha', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830']);
            
            $examen_si= NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->where('fecha', '!=', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830']);

            //Carrera
            if ($data['filtro_carrera']!=null) {
              $resultados= $resultados->where('fk_idCarrera', $data['filtro_carrera']);
              $examen_no = $examen_no->where( 'fk_idCarrera', $data['filtro_carrera']);
              $examen_si = $examen_si->where( 'fk_idCarrera', $data['filtro_carrera']);
            }

            //Nombre completo o numero de control
            if ($data['filtro_nombre']!=null) {
              $resultados = $resultados->where(function($query) use ($data){ 
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });

              $examen_no = $examen_no->where(function($query) use ($data){
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });

              $examen_si = $examen_si->where(function($query) use ($data){
                $query = $query->orWhere('nombre', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_paterno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('ap_materno', 'like', '%'.$data['filtro_nombre'].'%');
                $query = $query->orWhere('no_control', 'like', '%'.$data['filtro_nombre'].'%');  
              });
            }

            $resultados= $resultados->with('carrera')->orderBy('nivel')->get();
            $examen_no = $examen_no->with('carrera')->get();
            $examen_si = $examen_si->with('carrera')->get();
            
            $nivel = InglesAlumnos::where('estado', 1)->whereIn('configuracion_id',$confi)->whereHas('alumno',function($query)use($data){
                $query = $query->where('fk_idCarrera',$data['filtro_carrera']);
                $query = $query->with('carrera');
            })->whereNotIn('id', ['21', '290'])->get();
            $no_contestaron = AlumnosAdmision::where('fk_idCarrera',$data['filtro_carrera'])->where('fk_idPeriodo', $periodo)->where('pago', '1')->whereNotIn('idAlumnoAdmi', $ids)->whereNotIn('idAlumnoAdmi', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        } else {
            $resultados = NGL_ResultadosUbicacion::whereIn('idConfi', $confi)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->whereNotNull('fecha')->orderBy('nivel')->get();
            $examen_no= NGL_ResultadosUbicacion::where('estadoIngles', 2)->whereIn('idConfi', $confi)->where('fecha', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
            $examen_si= NGL_ResultadosUbicacion::where('estadoIngles', 2)->whereIn('idConfi', $confi)->where('fecha', '!=', null)->whereNotIn('idEscolares', ['2410', '4282', '4341', '4830'])->with('carrera')->get();            
            $nivel = InglesAlumnos::where('estado', 1)->whereIn('configuracion_id',$confi)->with('alumno.carrera')->whereNotIn('id', ['21', '290'])->get();
            $no_contestaron = AlumnosAdmision::where('fk_idPeriodo', $periodo)->where('pago', '1')->whereNotIn('idAlumnoAdmi', $ids)->whereNotIn('idAlumnoAdmi', ['2410', '4282', '4341', '4830'])->with('carrera')->get();
        }

        $pdf = \PDF::loadView('examen_ingles.reporte.export_pdf', compact('resultados', 'examen_si', 'examen_no', 'nivel', 'no_contestaron'));
        return $pdf->download('examen_ubicacion.pdf');
    }
}