<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Storage;
use Auth;
use DB;
use App\Configuracion as Configuracion;
use App\Pais as Pais;
use App\ExperienciaDocente as ExperienciaDocente;
use App\TipoVinculacionDocente as TipoVinculacionDocente;
use App\Nivel as Nivel;
use App\Http\Controllers\HelperController ;

class ExperienciaDocenteController extends Controller {

  public function show_info($msg = null) {
    $configuracion = Configuracion::where('llave', '=', 'limit_date')->first();
    if (strtotime($configuracion['valor']) >  (time()- 5 * 3600) || Auth::user()->isAdmin()) {
      $aspirante_id = Auth::user()->id;
        //Contamos la cantidad de registros de cada tipo de formulario para visualizarlos en las pestañas
        //de la plantilla (main.blade.php)
        $objeto = new HelperController();
        $count = $objeto->menu($aspirante_id);


      $user_email = Auth::user()->email;

      $experiencias_docente_info = ExperienciaDocente::where('aspirantes_id', '=', $aspirante_id)->get();
      $tipos_vinculacion_docente = TipoVinculacionDocente::all();
      $paises = Pais::all();
      $niveles = Nivel::all();

      //Si no hay entrada de adjunto válida, se crea una entrada con el id de usuario, por lo tanto, cambiamos el enlace para no mostrar esta información
      foreach ($experiencias_docente_info as $cur_key=>$cur_value) {
        if (preg_match("/^[0-9]+$/", $cur_value["ruta_adjunto"])) {            //La expresión regular para los ids autonuméricos
          $experiencias_docente_info[$cur_key]["ruta_adjunto"]=null;
        }
      }

      // Construimos un texto de "meses y días" para mostrar al usuario
      $experiencias_docente_info->transform(function ($item) {
        if ($item->fecha_inicio && $item->fecha_finalizacion) {
          $item->tiempo_meses_texto = app('App\Http\Controllers\ExperienciaLaboralController')
            ->experienciaMesesDiasTexto($item->fecha_inicio, $item->fecha_finalizacion);
        } else {
          $item->tiempo_meses_texto = $item->tiempo_meses . ' ' . ($item->tiempo_meses === 1 ? 'mes' : 'meses');
        }
        return $item;
      });

      $data = array(
        'aspirante_id' => $aspirante_id,
        'experiencias_docente' => $experiencias_docente_info,
        'tipos_vinculacion_docente' => $tipos_vinculacion_docente,
        'niveles' => $niveles,
        'paises' => $paises,
        'msg' => $msg,
        'count' => $count
      );
      return view('experiencia_docente', $data);
    }
    else{
      $data = array(
        'limit_date' => $configuracion['valor']
      );
      auth()->logout();
      return view('auth/timeout', $data);
    }
  }

  public function insert() {
    $input = Input::all();
    $id = Auth::user()->id;
    $userCode = Auth::user()->codigo;
    $today = new \DateTime('today');

    if (empty($input['fecha_inicio'])) {
      return $this->show_info("La fecha de inicio es obligatoria.");
    }
    $fechaInicio = \DateTime::createFromFormat('Y-m-d', $input['fecha_inicio']);
    if (!$fechaInicio) {
      return $this->show_info("La fecha de inicio no tiene un formato válido.");
    }
    if ($fechaInicio > $today) {
      return $this->show_info("La fecha de inicio no puede estar en el futuro.");
    }

    if (!isset($input['en_curso'])) {
      return $this->show_info("Debe indicar si la vinculación está vigente.");
    }

    //Verificamos si la vinculación está en curso para no tener en cuenta la fecha de finalización
    if ($input['en_curso']==1) {
      $input['fecha_finalizacion'] =  (new \DateTime())->format('Y-m-d');
    } else {
      if (empty($input['fecha_finalizacion'])) {
        return $this->show_info("La fecha de finalización es obligatoria cuando la vinculación no está vigente.");
      }
      $fechaFinalizacion = \DateTime::createFromFormat('Y-m-d', $input['fecha_finalizacion']);
      if (!$fechaFinalizacion) {
        return $this->show_info("La fecha de finalización no tiene un formato válido.");
      }
      if ($fechaFinalizacion > $today) {
        return $this->show_info("La fecha de finalización no puede estar en el futuro.");
      }
      if ($fechaInicio > $fechaFinalizacion) {
        return $this->show_info("La fecha de inicio no puede ser superior a la fecha de finalización.");
      }
    }

    $aleatorio = rand(111111, 999999);
    $titulo = substr($input['nombre_institucion'], 0, 12);
    $titulo = $titulo . $aleatorio;
    $titulo = str_replace(' ', '_', $titulo);
    //Guardamos el archivo de soporte de experiencia docente si existe
    if (isset($input['adjunto'])) {
      $file = Input::file('adjunto');
      //$titulo = str_replace(' ', '_', $input['nombre_institucion']) . '_' . $input['fecha_inicio'];
      $file->move(public_path() . '/file/' . $userCode . '/experiencia_docente/' , $titulo . '.pdf');

      $input['ruta_adjunto'] = 'file/' . $userCode . '/experiencia_docente/' . $titulo . '.pdf';
      unset($input['adjunto']);
    }

    // No permitir intensidades negativas
    if (isset($input['info_asignaturas']['intensidad']) && is_array($input['info_asignaturas']['intensidad'])) {
      foreach ($input['info_asignaturas']['intensidad'] as $key => $val) {
        $num = is_numeric($val) ? (float) $val : 0;
        $input['info_asignaturas']['intensidad'][$key] = $num < 0 ? 0 : $num;
      }
    }

    //Adaptamos el campo info_asignaturas (es un array, lo volvemos JSON y lo guardamos en la BD)
    $input['info_asignaturas'] = json_encode(self::transpose($input['info_asignaturas']));
    $input['aspirantes_id'] = $id;
    $input['tiempo_meses'] = app('App\Http\Controllers\ExperienciaLaboralController')->experienciaMeses($input['fecha_inicio'],$input['fecha_finalizacion']);

    $experiencia_docente = ExperienciaDocente::create($input);
    if ($experiencia_docente->save()) {
      return $this->show_info("Se ingresó exitosamente la información de experiencia docente.");
    }
  }

  public function delete() {
    $input = Input::all();
    $vinculacion = ExperienciaDocente::find($input["id"]);

    if ($vinculacion->ruta_adjunto) {
      Storage::delete($vinculacion->ruta_adjunto);
    }
    if ($vinculacion && $vinculacion->delete()) {
      return $this->show_info("Se borró la información de la experiencia docente.");
    } else {
      return $this->show_info();
    }
  }

  //Solo para PHP 5.6+
  private static function transpose($array) {
    $out = array();
    foreach ($array as $key => $subarr) {
      foreach ($subarr as $subkey => $subvalue) {
        $out[$subkey][$key] = $subvalue;
      }
    }
    return $out;
  }

}
