<?php

use Illuminate\Support\Facades\Auth;

class UsuariosController extends BaseController {

	public static $jqgrid_colmodel = [
		[
			'label' => 'Id',
			'name' => 'ID',
			'hidden' => true
		],
		[
			'label' => 'Usuario',
			'name' => 'USUARIO',
		],
		[
			'label' => 'Nombre',
			'name' => 'NOMBRE_USUARIO',
		],
		[
			'label' => 'Email',
			'name' => 'EMAIL',
		],
		[
			'label' => 'Rol',
			'name' => 'PRODUCCION_ROLES.NOMBRE',
		],
	];

	/**
	 * Muestra grilla de Usuarios
	 * @return mixed
	 */
	public function index() {
		$title = 'Usuarios';
		Breadcrumb::append_crumb($title);
		Jqgrid::add_js_colmodel('formulas', self::$jqgrid_colmodel);
		$roles = DB::table('PRODUCCION_ROLES')->lists('NOMBRE', 'ID');
		return View::make('usuarios.index', compact('title', 'roles'));
	}

	/**
	 * Genera el json para cargar los datos en jqgrid
	 * @return string
	 */
	public function datagrid() {
		Jqgrid::init('PRODUCCION_USUARIOS', self::$jqgrid_colmodel);
		Jqgrid::get_query()
			->join('PRODUCCION_ROLES', 'PRODUCCION_USUARIOS.IDROL', '=', 'PRODUCCION_ROLES.ID')
			->whereNull('FECHA_ELI');
		return Jqgrid::datagrid();
	}

	/**
	 * Agrega usuario a base de datos
	 * @return mixed
	 */
	public function agregar() {
		$vrules = [
			'USUARIO' => 'required|unique:PRODUCCION_USUARIOS,USUARIO,NULL,ID,FECHA_ELI,NULL',
			'NOMBRE_USUARIO' => 'required',
			'EMAIL' => 'required|email',
			'IDROL' => 'required|exists:PRODUCCION_ROLES,ID',
			'PASSWORD' => 'required|min:6|confirmed'
		];

		$vmessages = [
			'USUARIO.required' => 'El campo Usuario es obligatorio.',
			'USUARIO.unique' => 'El campo Usuario ya se encuentra ocupado.',
			'NOMBRE_USUARIO.required' => 'El campo Nombre es obligatorio.',
			'EMAIL.required' => 'El campo Email es obligatorio.',
			'EMAIL.email' => 'El campo Email no tiene un formato correcto (ejemplo@email.cl).',
			'IDROL.required' => 'El campo Rol es obligatorio.',
			'IDROL.exists' => 'El campo Rol no existe en base de datos.',
			'PASSWORD.required' => 'El campo Contraseña es obligatorio.',
			'PASSWORD.min' => 'El campo Contraseña debe tener mínimo :min caracteres.',
			'PASSWORD.confirmed' => 'Las Contraseñas no coinciden.',
		];

		$validador = Validator::make(Input::all(), $vrules, $vmessages);

		if($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		} else {
			$result = DB::transaction(function() {
				$id_inserted = DB::table('PRODUCCION_USUARIOS')->insert(array_replace_recursive(Input::except('PASSWORD_confirmation'), ['PASSWORD' => Hash::make(Input::get('PASSWORD'))]));
				return ['success' => true, 'id' => $id_inserted];
			});

			if(isset($result['success'])) {
				$message = ['content' => 'El usuario fue agregado.', 'type' => 'success', 'id' => $result['id']];
				$response = ['status' => 200, 'message' => $message];
			} else {
				$message = ['content' => 'El usuairo no pudo ser agregado.', 'type' => 'error'];
				$response = ['status' => 409, 'message' => $message];
			}
		}

		return Response::json($response, $response['status']);
	}

	/**
	 * Obtiene usuario a partir de id
	 *
	 * @param int $id
	 * @return mixed
	 */
	public function obtener($id) {
		$usuario = DB::table('PRODUCCION_USUARIOS')
			->where('ID', $id)
			->select('ID', 'USUARIO', 'NOMBRE_USUARIO', 'EMAIL', 'IDROL')
			->first();
		return Response::json($usuario, 200);
	}

	/**
	 * Edita usuario
	 * @return mixed
	 */
	public function editar() {
		$id = Input::get('id');

		$usuario = DB::table('PRODUCCION_USUARIOS')->where('ID', $id)->whereNull('FECHA_ELI')->first();

		if(empty($usuario)) {
			$message = ['content' => 'El usuairo no existe.', 'type' => 'error'];
			$response = ['status' => 404, 'message' => $message];
			return Response::json($response, $response['status']);
		}

		$vrules = [
			'USUARIO' => "required|unique:PRODUCCION_USUARIOS,USUARIO,$id,ID,FECHA_ELI,NULL",
			'NOMBRE_USUARIO' => 'required',
			'EMAIL' => 'required|email',
			'IDROL' => 'required|exists:PRODUCCION_ROLES,ID',
			'PASSWORD' => 'min:6|sometimes|confirmed'
		];

		$vmessages = [
			'USUARIO.required' => 'El campo Usuario es obligatorio.',
			'USUARIO.unique' => 'El campo Usuario ya se encuentra ocupado.',
			'NOMBRE_USUARIO.required' => 'El campo Nombre es obligatorio.',
			'EMAIL.required' => 'El campo Email es obligatorio.',
			'EMAIL.email' => 'El campo Email no tiene un formato correcto (ejemplo@email.cl).',
			'IDROL.required' => 'El campo Rol es obligatorio.',
			'IDROL.exists' => 'El campo Rol no existe en base de datos.',
			'PASSWORD.min' => 'El campo Contraseña debe tener mínimo :min caracteres.',
			'PASSWORD.confirmed' => 'Las Contraseñas no coinciden.',
		];

		$validador = Validator::make(Input::all(), $vrules, $vmessages);

		if($validador->fails()) {
			$response = $validador->messages();
			return Response::json($response, 422);
		} else {
			$result = DB::transaction(function() use ($id){
				$usuario = Input::except(['id', 'PASSWORD', 'PASSWORD_confirmation']);
				if(Input::get('PASSWORD') != '') {
					$usuario['PASSWORD'] = Hash::make(Input::get('PASSWORD'));
				}
				$id_inserted = DB::table('PRODUCCION_USUARIOS')->where('ID', $id)->update($usuario);
				return ['success' => true, 'id' => $id_inserted];
			});

			if(isset($result['success'])) {
				$message = ['content' => 'El usuario fue editado.', 'type' => 'success', 'id' => $result['id']];
				$response = ['status' => 200, 'message' => $message];
			} else {
				$message = ['content' => 'El usuairo no pudo ser editado.', 'type' => 'error'];
				$response = ['status' => 409, 'message' => $message];
			}
		}

		return Response::json($response, $response['status']);
	}

	/**
	 * Oculta usuario de base de datos no lo elimina
	 * @return mixed
	 */
	public function eliminar() {
		$success = DB::table('PRODUCCION_USUARIOS')
			->where('ID', Input::get('id'))
			->update(['FECHA_ELI' => date('Ymd H:i:s')]);

		if($success) {
			$message = ['content' => 'El usuario fue eliminado.', 'type' => 'success'];
			$response = ['status' => 200, 'message' => $message];
		} else {
			$message = ['content' => 'El usuairo no pudo ser eliminado.', 'type' => 'error'];
			$response = ['status' => 409, 'message' => $message];
		}

		return Response::json($response, $response['status']);
	}

	/**
	 * Valida credenciales de usuario
	 * @return mixed
	 */
	public function login() {
		$credentials = [
			'USUARIO' => Input::get('usuario'),
			'PASSWORD' => Input::get('password'),
			'FECHA_ELI' => NULL //Valida que el usuario no haya sido eliminado
		];

		$rules = [
			'USUARIO' => 'required',
			'PASSWORD' => 'required'
		];

		$remember = is_null(Input::get('remember'))?FALSE:TRUE;
		//validating the credentials.
		$validator = Validator::make($credentials,$rules);

		//in case the credentials are valid. Try to login the user.
		if($validator->passes())
		{
			if(Auth::attempt($credentials, $remember))
			{
				//if successfull redirect the user
				return Redirect::to('/');
			}
			//else send back the login failure message.
			return Redirect::back()->withInput()->withErrors(['El nombre de usuario o la contraseña son incorrectos!']);
		}
		//send back the validation errors.
		return Redirect::back()->withErrors($validator)->withInput();
	}

	/**
	 * Cierra Sesión
	 * @return mixed
	 */
	public function logout() {
		Auth::logout();
		return Redirect::to('/login');
	}

}
