<?php namespace App\Http\Controllers;

//use App\Custom\IFXConnection;
use App\Custom\SQLConnection;
use App\Custom\Misc;
use Request;
use Session;
use DB;
 
class LoginController extends Controller  {

	//obtiene la vista de login
	public function obtenerLogin() {
		$mensaje = '';
		if(request::Input('ns')) {
		  $mensaje = 'Su sesión expiró, por favor vuelva a iniciar sesión';
		}
		return view('login')
		->with('url','productos')
		->with('mensaje',$mensaje);
	}

/*
	//obtiene la vista de login, sólo para demo
	public function obtenerLoginDemo(){
		return view('login')->with('url','informes/buscador');
	}
*/
	//Cambiar la clave actual con parametros post.
	public function cambiarClave() {	
		$usuario 				= Misc::decrypt(Request::input('u'));
		$clave_anterior = Request::input('old_password');
		$clave_nueva 		=	Request::input('new_password');
		$respuesta = SQLConnection::cambiarClave($usuario,$clave_anterior,$clave_nueva);
		if(isset($respuesta->status)) {
			switch ($respuesta->status) {
		case '20':
		  return json_encode(array('error' => 0,'mensaje' => "OK"));
		break;
		default:
		  return json_encode(array('error' => 1,'mensaje' => $respuesta->status_message));
		break;
	  }
	}
	}

	//Envía mail para restablecer la clave de un usuario
	public function enviarRestablecerClave() {
		$mail  = Request::input('mail');

		$data = SQLConnection::enviarRestablecerClave($mail);
		if(!isset($data)) {
		return json_encode(array('error' => 1,'mensaje' => "No existe ningún usuario relacionado con esa cuenta de mail, por favor verifique los datos ingresados."));
		}
		$date =strtotime("now");
		$content 						= new \stdClass();
		$content->username  = $data->username;
		$user_encrypt       = Misc::encrypt(json_encode(array('u' => $data->username,'d' => $date)));
		$content->link      = "https://".\Request::header()['host'][0]."/restablecer-clave?u=$user_encrypt";
		if(Misc::enviarMail("mails/restablecer_clave",$data->email,$content,"Recuperación de Clave",'',env('EMAIL_SOPORTE'))) {
		return json_encode(array('error' => 0,'mensaje' => "Se enviaron los datos de restablecimiento de mail a ".$mail));
		}
		return json_encode(array('error' => 1,'mensaje' => 'Ocurrió un error al intentar procesar su solicitud, por favor reintente mas tarde'));
	
	}

	/*Vista con el formulario de restablecimiento de clave, previamente se chequea que posea 20 min de duración máxima de restablecimiento de la misma sino debe
	volver a pedir otro restablecimiento de clave.*/
	public function obtenerRestablecerClave() {
		$usuario = json_decode(Misc::decrypt(Request::input('u')));
		$error = "";
		if(!$usuario) {
		$error = "Ocurrió un error inesperado, por favor vuelva a recuperar la clave desde el menú";
		return \View::make('formulario_restablecer_clave')->with('error',$error)->with('usuario',$usuario);
		
		}
		$date1 = new \DateTime(date('Y-m-d H:i:s',$usuario->d));
		$date2 = new \DateTime("now");
		$interval = $date1->diff($date2);
		if($interval->y > 0 || $interval->m > 0 || $interval->d > 0 || $interval->h > 0 || $interval->i > 20) {
		$error = "La sesión expiró por favor vuelva a reiniciar el proceso de recuperación de clave <a href='/'>Aquí</a>";
		}
		$usuario = Misc::encrypt(json_encode(array('usuario' => (string)$usuario->u)));
		return \View::make('formulario_restablecer_clave')->with('error',$error)->with('usuario',$usuario);
	}


	//cambia la contraseña de un usuario sin su clave anterior, esto solo ocurre cuando el usuario olvida su clave.
	public function restablecerClave() {
		$respuesta 	= json_decode(Misc::decrypt(Request::input('u')));
		$clave 			= Request::input('clave');
		if(!isset($respuesta->usuario) || !$clave){return false;}
		$usuario 		= $respuesta->usuario;
	$data 			= SQLConnection::restablecerClave($usuario,$clave);
		if($data->status == 20) {
	  return json_encode(array('error' => 0,'mensaje' => $data->status_message));
		} else {
	  return json_encode(array('error' => 1,'mensaje' => $data->status_message));
		}
	}
	
	//Si los datos son correctos inicia y genera una sesión para el usuario
	public function iniciarSesion() {
		$cookie = '';
		$usuario 	=	Request::Input('usuario');
		$clave 		= Request::Input('clave');
		if(!isset($usuario) || !isset($clave)) {
			return false;
		}
		$usuario 	= SQLConnection::iniciarSesion($usuario,$clave,$simultaneo=0);
		
		if (isset($usuario->status)) {
			if ($usuario->status == 0 || $usuario->status == 1) {
			
				//$cliente = SQLConnection::obtenerCliente($usuario->user_id);
				$cliente = SQLConnection::obtenerCliente(ENV('ID_INFORME_COMERCIAL'),$usuario->user_id);
				if(isset($cliente[0]->error) && ($cliente[0]->error == 99)) {
		  		return json_encode(array('error' => 99,'mensaje' => "Error 114: Este cliente no tiene productos activos."));
				}else if (isset($cliente[0]->id_producto) && !($cliente[0]->id_producto)) {
					return json_encode(array('error' => 98,'mensaje' => "El cliente no tiene ningún producto asignado"));
				}
				$username = strtolower($usuario->username);		
			}
			if(isset($cliente[0]->tipo_paquete) && $cliente[0]->tipo_paquete == 'P') {
				$desde = date_create($cliente[0]->fecha_desde);
				$hasta = date_create($cliente[0]->fecha_hasta);
				$hoy   = date_create(date('Y-m-d'));
				if ($desde > $hoy || $hasta < $hoy) {
					return json_encode(array('error' => 97,'mensaje' => "Su producto anual contratado se encuentra vencido"));
				}
			}
			switch ($usuario->status) {
			case '0':
			$cliente_ordenado = [];
			$client_id 				= 0;
			foreach ($cliente as $key => $value) {
				if($key == 'client_id') {
					$client_id = $value->client_id;
				}
				$cliente_ordenado[$value->id_producto] = $value;
			}
			$secciones = self::obtenerSeccionesHabilitadas($usuario->user_id);
			$secciones = array_change_key_case($secciones, CASE_LOWER);
			$usuario->informe_comercial = false;
			if($secciones){
				$cliente_ordenado[ENV('ID_INFORME_COMERCIAL')]->secciones = $secciones;
				$usuario->informe_comercial = true;
			}
			$usuario->cliente 						= $cliente_ordenado;
			$usuario->cliente['client_id']= $client_id;
			
			$preferencias = SQLConnection::backendStoreProcedure('obtener_preferencias_usuario', array($usuario->user_id), true);
			$usuario->preferencias = $preferencias;

			$led_access = DB::selectOne('EXEC dbo.LN_validar_acceso_usuario ? ,?', array(env('LED_PRODUCTO'), $usuario->user_id));
			//dd($led_access);
			$usuario->acceso_led = (!empty($led_access)) ? true : false;

			$led_control_ingreso = false;
			if ($usuario->acceso_led) {
							$ci = SQLConnection::backendStoreProcedure('LN_cliente_productos_', array('CONTROL_INGRESO', $usuario->cliente['client_id'], NULL, NULL, NULL, NULL, NULL, NULL), 'select');
				$led_control_ingreso = (!empty($ci)) ? true : false;
			}
			$usuario->led_control_ingreso = $led_control_ingreso;

			$iv_access = DB::selectOne('EXEC dbo.LN_validar_acceso_usuario ? ,?', array(env('IV_PRODUCTO'), $usuario->user_id));
			$usuario->acceso_iv = (!empty($iv_access)) ? true : false;

			$acceso_saas = DB::selectOne('EXEC dbo.LN_validar_acceso_usuario ? ,?', array(env('SAAS_PRODUCTO'), $usuario->user_id));
			$usuario->acceso_saas = (!empty($acceso_saas)) ? true : false;

			$user_horario = SQLConnection::backendStoreProcedure('obtener_users_horarios', array($usuario->user_id), 'selectOne');
			if(!isset($user_horario->respuesta)){
				return json_encode(array('error' => 100,'mensaje' => "No puede ingresar en éste momento"));
			}	
			$usuario->user_horario = $user_horario;	
			Session::put('usuario',$usuario);
			if ($usuario->acceso_iv == true) {
				$link = env('LINK_PANEL_CONTROL_IV');
			}else if ($usuario->acceso_led == true) {
				$link = env('LINK_DASHBOARD');
			}else {
			   	$link = env('LINK_BUSCADOR');
			}
			
			if(Request::getHttpHost() == env('URL_INFODATA')){
				$link = env('LINK_BUSCADOR');
			}
			Session::save();

			$cookie = \Cookie::get('disclaimer');
			return json_encode(array('error' => 0,'mensaje' => "OK",'cookie' => $cookie,'link' => $link));
		  	break;
			case '1':
		 		return json_encode(array('error' => 1,'u'=>Misc::encrypt($usuario->username),'mensaje' => $usuario->status_message,'cookie' => $cookie));
		  	break;
			default:
		  		return json_encode(array('error' => 2,'mensaje' => $usuario->status_message,'cookie' => $cookie));
		  	break;
			}
		}
	}

	public static function obtenerSeccionesHabilitadas($user_id) {
		$secciones_habilitadas 	= SQLConnection::obtenerSeccionesHabilitadasInforme($user_id,ENV('ID_INFORME_COMERCIAL'));
		$secciones_habilitadas_ordenadas = [];
		foreach($secciones_habilitadas as $secciones) {
			$secciones_habilitadas_ordenadas[$secciones->nombre_seccion] = $secciones; 
		}
		return $secciones_habilitadas_ordenadas;
	}

	//Elimina la sesión del usuario, y redirecciona a la home con un parámetro de reconocimiento
	public function cerrarSesion() {
   		Session::flush();
		return redirect('/?ns');
	}

	//obtener el disclaimer Legal.
	public function obtenerDisclaimer() { 
		//$disclaimer  = SQLConnection::obtenerTerminos();
		//dd($_SERVER); 
		$acceso_led = Session::get('usuario')->acceso_led ?? 0;
		$acceso_iv = Session::get('usuario')->acceso_iv ?? 0;
		$prod = 'FI';

		$disclaimer = SQLConnection::backendStoreProcedure('dbo.obtener_terminos', array($prod), true);
		$id_terminos = $disclaimer->id_terminos ?? 0; 
		Session::put('id_terminos',$id_terminos);
		Session::put('id_plataforma',$prod);
		Session::save();
		

		if($acceso_iv == 1){
			$link = env('LINK_PANEL_CONTROL_IV');
		}else if($acceso_led == 1){
				$link = env('LINK_DASHBOARD');
		}else{
				$link = env('LINK_BUSCADOR');
		}
		if(Request::getHttpHost() == env('URL_INFODATA')){
				$link = env('LINK_BUSCADOR');
		}
		return view('disclaimer')->with(compact('disclaimer','link'));
	}



	public static function formLogin() {

		$webdata = Session::get('webdata');
		if (!$webdata) {
			$wdata = DB::selectOne('EXEC dbo.obtener_web_data ?, ?', array($_SERVER['HTTP_HOST'], env('APP_ID')) );

			$pers = array('web_id' => $wdata->web_id,
									'web_name' => $wdata->web_name,
									'web_title' => $wdata->web_title,
									'http_host' => $wdata->http_host,
									'uri_logo' => $wdata->uri_logo,
									'uri_icon' => $wdata->uri_icon,
									'uri_css1' => $wdata->uri_css1,
									'uri_css2' => $wdata->uri_css2,
									'uri_js1' => $wdata->uri_js1);

			Session::put('webdata', $pers);
		}


		return view('login_form');
	}

}