<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Carbon\Carbon;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ExamenInglesCollectionImport;
use App\{Seccion, Periodo, Configuracion, Modulo, Pregunta, NivelIngles, ConfiguracionNivel};
use App\NGL_ModuloNivel;

class ExamenInglesController extends Controller
{
    /**
     * Retorna listado de las configuraciones de examen de ubicacion de nuevo ingreso
     */
    public function index() {
        $configuracion  = Configuracion::where('estado', '1')->orWhere('estado','0')->with('periodo')->get();
        $periodos       = Periodo::where('id', '>=', '5')->get();
        return view('examen_ingles.ubicacion.nuevo_ingreso.listado', compact('configuracion', 'periodos'));
    }

    /**
     * Retorna contenido de listado de acuerdo al periodo o no seleccionado 
     */
    public function filtro(Request $request){
        $data = $request->all();
        
        if ($data['filtro_periodo'] !=null) {
          $configuracion = Configuracion::where('estado', '1')
                                        ->orWhere('estado','0')
                                        ->where('periodo_id',$data['filtro_periodo'])
                                        ->with('periodo')
                                        ->paginate(100);
        } else {
          $configuracion = Configuracion::where('estado', '1')
                                      ->orWhere('estado','0')
                                      ->with('periodo')
                                      ->get();
        }
        
        return view('examen_ingles.ubicacion.nuevo_ingreso.contenido', compact('configuracion'))->with('no_pag', true);
    }

    /**
     * Muestra la vista para configurar un nuevo examen de ubicación de nuevo ingreso
     */
    public function create() {
        $niveles = NivelIngles::where('estado', '1')->get();
        $periodos = Periodo::where('id', '>=', '5')->get();
        return view('examen_ingles.ubicacion.nuevo_ingreso.nuevo', compact('periodos', 'niveles'));
    }

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

      $data = $request->all();
      $confi = Configuracion::where('estado', '1')->update(['estado' => '0']);

      //Validar si viene el archivo no hacer esta consulta
      if (!array_key_exists('archivo', $data)) {
        $idCopia = Configuracion::latest('id')->select('id')->where('estado', '0')->first();
      }
      
      $mostrar = strtotime( str_replace('T', ' ', $data['mostrar'].":00") );
      $ocultar = strtotime( str_replace('T', ' ', $data['ocultar'].":00") );

      if ( $mostrar < $ocultar ) {
        $idNuevo = Configuracion::create([ 
          'periodo_id'=>$data['periodo'], 
          'fecha_mostrar'=>$mostrar, 
          'fecha_ocultar'=>$ocultar, 
          'fecha'=>$data['fecha'], 
          'hora_inicio'=>$data['inicio'], 
          'hora_cierre'=>$data['cierre'], 
          'fecha_grupo'=>$data['publicacion'], 
          'duracion'=>$data['duracion'], 
          'estado'=>'1',
          'url'=>$data['enlace']
        ]);

        //Aqui volver a validar, si viene archivo, algoritmo para guardar si no el siguiente
        if (array_key_exists('archivo', $data)) {   
          Excel::import(new ExamenInglesCollectionImport, request()->file('archivo'));
        } else {
          
          $modulos = Modulo::where('configuracion_id', $idCopia->id)->with('seccion.pregunta', 'moduloNivel')->get();
          
          foreach ($modulos as $m) {
            if ($m->estado=='1') {

              $modulo_new = Modulo::create([  
                'configuracion_id'=>$idNuevo->id, 
                'nombre'=>$m->nombre, 
                'descripcion'=>$m->descipcion, 
                'min_ac' => $m->min_ac, 
                'estado'=>'1' ]);

              foreach ($m->moduloNivel as $n){
                $nivel = NGL_ModuloNivel::create(['modulo_id'=>$modulo_new->id, 'nivel_id'=>$n->nivel_id, 'aciertos'=>$n->aciertos]);
              }

              foreach ($m->seccion as $s) {
                if ($s->estado=='1') {
                  $seccion_new = Seccion::create([ 'modulo_id'=>$modulo_new->id, 'num'=>$s->num, 'indicacion'=>$s->indicacion, 'texto'=>$s->texto, 'audio'=>$s->audio, 'estado'=>'1']);

                  foreach ($s->pregunta as $p) {
                    if ($p->estado=='1') {
                      Pregunta::create([ 'seccion_id'=>$seccion_new->id, 'pregunta'=>$p->pregunta, 'resp_1'=>$p->resp_1, 'resp_2'=>$p->resp_2, 'resp_3'=>$p->resp_3, 'resp_4'=>$p->resp_4, 'resp_5'=>$p->resp_5, 'estado'=>'1', 'puntos'=>$p->puntos ]);
                    } 
                  }
                } 
              }
            }
          }

        }
        
        return response()->json(['estado'=>'success', 'message'=>'Examen configurado de manera exitosa.', 'idConfiguracion'=>$idNuevo->id ]);
      
      } else {
        return response()->json(['estado'=>'success', 'message'=>'La fecha para ocultar el mensaje tiene que ser despues de la fecha para mostrarlo.', 'idConfiguracion'=>$idNuevo->id, 'idConfiAnterior'=>$idCopia->id ]);
      }
    }

    /**
     * Muestra la vista de los modulos, secciones y preguntas del examen
     */
    public function show($id)
    {
      $confi = Configuracion::where('id', $id)->first();
      $date = Carbon::now('America/Mexico_City'); //2015-01-01 00:00:00

      $modulo = Modulo::where('configuracion_id', $id)->where('estado', '1')
                  ->with('seccion.pregunta')->get();

      if ( $confi->fecha->format('Y-m-d') > $date->format('Y-m-d' ) || 
         ( $confi->fecha->format('Y-m-d') == $date->format('Y-m-d') && $confi->hora_inicio > $date->format('H:i:s')) ) {
        //todavia no se aplica el examen
        return view('examen_ingles.preguntas.modificar', compact('modulo'));
      } else {
        //examen aplicado
        return view('examen_ingles.preguntas.consulta', compact('modulo'));
      }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
      $niveles = NivelIngles::where('estado', '1')->get();
      $periodos = Periodo::where('id', '>=', '5')->get();
      $c = Configuracion::where('id', $id)->with('niveles.nivel')->first();
      $date = Carbon::now('America/Mexico_City'); //2015-01-01 00:00:00

      if ( $c->fecha->format('Y-m-d') > $date->format('Y-m-d' ) || 
         ( $c->fecha->format('Y-m-d') == $date->format('Y-m-d') && $c->hora_inicio > $date->format('H:i:s')) ) {
        //todavia no se aplica el examen
        return view('examen_ingles.ubicacion.nuevo_ingreso.modificar', compact('periodos', 'niveles', 'c', 'date'));
      } else {
        //examen aplicado
        return view('examen_ingles.ubicacion.nuevo_ingreso.consultar', compact('periodos', 'niveles', 'c'));
      }
    }

    /**
     * Actualiza info del examen de ubicacion de nuevo ingreso
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
      $data = $request->all();
      $confi = Configuracion::where('id', $id)->first();
      
      $mostrar = strtotime( str_replace('T', ' ', $data['mostrar'].":00") );
      $ocultar = strtotime( str_replace('T', ' ', $data['ocultar'].":00") );

      if ( $mostrar < $ocultar ) {
        
        $confi->fecha_mostrar=$mostrar; 
        $confi->fecha_ocultar=$ocultar; 
        $confi->fecha=$data['fecha']; 
        $confi->hora_inicio=$data['inicio']; 
        $confi->hora_cierre=$data['cierre']; 
        $confi->fecha_grupo=$data['publicacion']; 
        $confi->url=$data['enlace']; 
        $confi->duracion=$data['duracion']; 
        $confi->save();
        
        return response()->json(['estado'=>'success', 'message'=>'Examen actualizado de manera exitosa.', 'idConfiguracion'=>$id ]);
      
      } else {
        return response()->json(['estado'=>'success', 'message'=>'La fecha para ocultar el mensaje tiene que ser despues de la fecha para mostrarlo.', 'idConfiguracion'=>$idNuevo->id ]);
      }
    }

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


}
