<?php

namespace App\Http\Controllers\NGRS;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ExamenIngresoCollectionImport;

use App\XM_IngresoEnunciado;
use App\{RFCarrera, XM_Ingreso, XM_Confi};

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;

use App\Exports\{ExamenAdmisionExport};
use App\{RFPeriodo, RFAspirante};

use App\Exports\Examen\Admision\ResultadosSheetExport;
use App\Exports\Examen\Admision\RespuestasSheetExport;

class ConfiExamenController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        
        $carreras = RFCarrera::where('tipo', 'LICENCIATURA')->where('estado', '1')->get();
        $periodos = RFPeriodo::where('id', '>=', '9')->get();
        $aspirantes = RFAspirante::where('fk_idEstatus', '2')
                                ->where('fk_idPeriodo', $periodos[count($periodos)-1]->id)
                                ->has('xm_aspirantes')
                                ->with('carrera')
                                ->with('xm_aspirantes')
                                ->with('periodo')
                                ->withCount('respuestas')
                                ->withCount('aciertos')
                                /*->whereHas('xm_aspirantes', function($query){
                                    $query = $query->where('inicio_exa', '>=', '2022-06-14 10:00:00');
                                })*/
                                ->whereNotIn('id', ['1', '2'])
                                ->orderBy('ap_paterno', 'asc')
                                ->orderBy('ap_materno', 'asc')
                                ->orderBy('nombre', 'asc')
                                ->paginate(100);
        //dd($aspirantes);
        return view('examen.ingreso.resultados.principal', 
            compact(['carreras', 'aspirantes', 'periodos']))
            ->with('no_pag', true);
    }

    public function filtro(Request $request)
    {
        $data = $request->all();
        
        $aspirantes = RFAspirante::has('xm_aspirantes');

        if ($data['filtro_periodo']!=null) {
            $aspirantes = $aspirantes->where('fk_idPeriodo', $data['filtro_periodo']);
        } else {
            $aspirantes = $aspirantes->where('fk_idPeriodo', '>=', '9');
        }

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

        if ($data['filtro_folio']!=null) {
            $aspirantes = $aspirantes->where('id', $data['filtro_folio']);
        }

        if ($data['filtro_nombre']!=null) {
            $aspirantes = $aspirantes->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'].'%');
            });
        }

        if ($data['filtro_inicio']!=null) {
            if ($data['filtro_fin']!=null) {
                //buscar dentro del rango de fecha
                $aspirantes = $aspirantes->whereHas('xm_aspirantes', function($query) use ($data) {
                    $query = $query->whereBetween('acceso_exa', $data['filtro_inicio'], $data['filtro_fin'] );
                });
            } else {
                //buscar solo de ese dia
                $aspirantes = $aspirantes->whereHas('xm_aspirantes', function($query) use ($data) {
                    $query = $query->whereDate('acceso_exa', $data['filtro_inicio'] );
                });
            }
        }

        if (array_key_exists('filtro_especial', $data)) {
            switch ($data['filtro_especial']) {
                case 'aceptados':
                    $aspirantes = $aspirantes->whereHas('xm_aspirantes', function($query) use ($data) {
                        $query = $query->where('resultado', '1' );
                    });
                    break; 

                case 'no_aceptados':
                    $aspirantes = $aspirantes->whereHas('xm_aspirantes', function($query) use ($data) {
                        $query = $query->where('resultado', '0' );
                    });
                    break; 

                case 'no_acceso':
                    $aspirantes = $aspirantes->whereHas('xm_aspirantes', function($query) use ($data) {
                        $query = $query->whereNull('acceso_exa');
                    });
                    break;
            }
        }

        $aspirantes = $aspirantes->where('fk_idEstatus', '2')
                                ->with('carrera')
                                ->with('xm_aspirantes')
                                ->with('periodo')
                                ->withCount('respuestas')
                                ->withCount('aciertos')
                                ->whereNotIn('id', ['1', '2'])
                                ->orderBy('ap_paterno', 'asc')
                                ->orderBy('ap_materno', 'asc')
                                ->orderBy('nombre', 'asc')
                                ->paginate(100);
        //dd($aspirantes);
        return view('examen.ingreso.resultados.contenido', 
            compact(['aspirantes']))
            ->with('no_pag', true);
    }

    /*Funcion para exportar de acuerdo a filtro resultados del examen de admision e excel*/
    public function export_resultados(Request $request) 
    {
        $data = $request->all();
        //dd($data);
        //return (new VauchersExport('2018','2019'))->download('invoices.xlsx');
        return (new ResultadosSheetExport($data))->download('resultados_examen.xlsx');
    }

    public function export_respuestas($folio){
        
        return (new RespuestasSheetExport($folio))->download("respuestas_".$folio.".xlsx");
    }

    /**
     * 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)
    {
        $data = $request->all();

        $h = Excel::import(new ExamenIngresoCollectionImport, request()->file('file'));
        //return response()->json(['status'=>'success', 'message'=>'Importación Exitosa!!'.$h]);

        //falta que guarde el csv y mandar la consulta de preguntas capturadas a la vista
        return response()->json(['estado'=>'vista','vista'=>view('examen.ingreso.confi.examen.respuesta').""]);
        //return response()->json(['estado'=>'vista','vista'=>view('vaucher.nuevo', compact('alumno','pago','bandera','rechaz')).""]);

    }

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

        $examen = XM_Ingreso::where('areaConocimiento_id', $data['area'])
                        ->with('enunciado')
                        ->whereHas('configuracion', function($query) use ($data){
                            $query = $query->where('periodo_id', $data['periodo'] );
                        })->first();

        $nuevo_examen = XM_Ingreso::create([
            'confi_id' => $data['confi'],
            'areaConocimiento_id' => $data['area'],
            'reactivos' => $examen->reactivos,
        ]);

        foreach($examen->enunciado as $e){
            XM_IngresoEnunciado::create([
                'ingreso_id'=> $nuevo_examen->id,
                'enunciado' => $e->enunciado,
                'resp_1' => $e->resp_1,
                'resp_2' => $e->resp_2,
                'resp_3' => $e->resp_3,
                'resp_4' => $e->resp_4,
                'imagen' => $e->imagen,
                'estado_img' => $e->estado_img,
            ]);

            if ($e->imagen!=null) {
                //duplica las imagenes de un examen anterior a la nueva carpeta
                Storage::disk('img_xmn')->copy($examen->confi_id."/".$examen->id."/".$e->imagen, $nuevo_examen->confi_id."/".$nuevo_examen->id."/".$e->imagen );
            }
                
        }

        $preguntas = $examen->enunciado;
        $i = $nuevo_examen->reactivos;
        $id = $nuevo_examen->id;
        $idArea = $data['area'];
        $imagenes = XM_IngresoEnunciado::with('ingreso')->where('ingreso_id', $id)->whereNotNull('imagen')->get();

        return response()->json([
            'id' => $id,
            'mensaje' => 'Total de registros analizados:'.$i,
            'vista' => view('examen.ingreso.confi.examen.respuesta_reuso', compact(['preguntas', 'i', 'id', 'imagenes', 'idArea' ])).""
        ]);

    }

    /**
     * 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)
    {
        //
    }

    /**
     * Elimina el examen en el momento en q se crea, despues ya no creo q pueda ja
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        XM_IngresoEnunciado::where('ingreso_id', $id)->delete();
        XM_Ingreso::where('id',$id)->delete();

        return response()->json([
            'estado' => "exito",
            'mensaje' => "Examen eliminado con éxito."
        ]);
    }

    public function imagenes(Request $request){
        $data = $request->all();
        $file = $request->file('file');

        $name = $file->getClientOriginalName();
        $img = XM_IngresoEnunciado::where('ingreso_id', $data['idExamenIngreso'])->where('imagen', $name)->first();

        if ($img != null) {
            if ($img->estado_img==0) {
                $img->estado_img=1;
                $img->save();

                $path = $file->storeAs($data['idConfi']."/".$data['idExamenIngreso'], $name, 'img_xmn');
            } else {
                //elimina la imagen para volver a subirla
                $dato['mensaje'] = "Elimina la imagen primero, antes de volver a subirla.";
                abort(406, json_encode($dato) )->header('Content-Type', 'application/json'); 
            }
        } else {
            //el nombre de esta imagen no se encontro en el examen de esta area
            $dato['mensaje'] = "El nombre de esta imagen no se encuentra registrada para este examen";
            abort(406, json_encode($dato) )->header('Content-Type', 'application/json'); 
        }
        
        //dd($data['file']->getClientOriginalName());
        /*for ($i=0; $i < count($comprobantes); $i++) { 
            $exte = $request->file('imagen_'.$i)->getClientOriginalExtension();
            if ($exte=='jpg' || $exte=='jpeg' || $exte=='JPG' || $exte=='JPEG' || $exte=='png' || $exte=='PNG') {
            } else {
                return response()->json(['estado'=>'error', 'mensaje'=>'Solo esta permitido subir imagenes en formato jpg, png, jpeg.']);
            }

        }*/
    }

    /*
        Esta debe de ser la funcion chida, porq es la q convierte las imagenes a webp
        
    public function imagenes(Request $request){
        $data = $request->all();
        $file = $request->file('file');

        $name = $file->getClientOriginalName();
        $exte = $file->getClientOriginalExtension();
        
        if (!($exte=='jpg' || $exte=='jpeg' || $exte=='JPG' || $exte=='JPEG' || $exte=='png' || $exte=='PNG')) {
            return response()->json(['estado'=>'error', 'mensaje'=>'Solo esta permitido subir imagenes en formato jpg, png, jpeg.']);
        }

        $ext = explode('.',$name);
        $salida = "";
        for ($i=0; $i < sizeof($ext)-1; $i++) { 
            $salida = $salida . strval($ext[$i]).".";
        }

        $img = \Image::make($file);
        $img->save(public_path($name), '60');

        $r = \public_path($name);
        $ruta_anterior = public_path()."/".$name;
        $ruta_nueva = public_path().'/img/xmn/'.$data['idConfi']."/".$data['idExamenIngreso']."/".$name;

        
    
        rename($ruta_anterior, $ruta_nueva);
        //Storage::move($r, 'img/xmn/'.$data['idConfi']."/".$data['idExamenIngreso'].$name);
        //$path = $img->storeAs($data['idConfi']."/".$data['idExamenIngreso'], $name, 'img_xmn');
        dd("fin");

        $img = XM_IngresoEnunciado::where('ingreso_id', $data['idExamenIngreso'])->where('imagen', $name)->first();

        if ($img != null) {
            if ($img->estado_img==0) {
                $img->estado_img=1;
                $img->imagen = $salida;
                $img->save();
        

                $path = $file->storeAs($data['idConfi']."/".$data['idExamenIngreso'], $name, 'img_xmn');
            } else {
                //elimina la imagen para volver a subirla
                $dato['mensaje'] = "Elimina la imagen primero, antes de volver a subirla.";
                abort(406, json_encode($dato) )->header('Content-Type', 'application/json'); 
            }
        } else {
            //el nombre de esta imagen no se encontro en el examen de esta area
            $dato['mensaje'] = "El nombre de esta imagen no se encuentra registrada para este examen";
            abort(406, json_encode($dato) )->header('Content-Type', 'application/json'); 
        }
        
        //dd($data['file']->getClientOriginalName());
        /*for ($i=0; $i < count($comprobantes); $i++) { 
            $exte = $request->file('imagen_'.$i)->getClientOriginalExtension();
            if ($exte=='jpg' || $exte=='jpeg' || $exte=='JPG' || $exte=='JPEG' || $exte=='png' || $exte=='PNG') {
            } else {
                return response()->json(['estado'=>'error', 'mensaje'=>'Solo esta permitido subir imagenes en formato jpg, png, jpeg.']);
            }

        }*
    }*/

    //retorna la lista de los periodos en los que se capturo el examen de un area en especifico
    public function periodo(Request $request){
        $data = $request->all();
        $vec = [];

        $xmn = XM_Ingreso::where('areaConocimiento_id', $data['idArea'])->with('configuracion.periodo')->get();

        foreach ($xmn as $x) {
            array_push($vec, [
                "idPeriodo" => $x->configuracion->periodo->id,
                "periodo" => $x->configuracion->periodo->nombre,
            ]);
        }
        
        return response()->json($vec);
    }

    //genera el excel de un examen por area de conocimiento anterior
    public function export(Request $request){
        $data = $request->all();
        
        $reactivos = XM_Ingreso::where('areaConocimiento_id', $data['area'])
                            ->whereHas('configuracion', function($query) use ($data) {
                                $query = $query->where('periodo_id', $data['periodo']);
                            })->with('enunciado', 'configuracion.periodo')
                            ->first();
        
        return new ExamenAdmisionExport($reactivos);
    }



}
