create procedure sistema.sp_autenticarUsuario
@txtUsername varchar(50),
@txtContrasenia nvarchar(300),
@dbResponse varchar(300) output,
@dbId int output,
@dbIntentos int output
as
begin
	set nocount on;
	declare @dbCnt int;
	declare @dbBloqueo bit,@dbPrimerIngreso bit,@dbCambioContrasenia bit;
	declare @dbContrasenia nvarchar(300);
	declare @dbError varchar(300);
	declare @dbFechaSolicitud datetime;
	begin tran autenticarUsuario
	begin try
		select @dbCnt = COUNT(*) from sistema.datos_usuarios where username = @txtUsername and estado = 1;

		if @dbCnt > 0
			begin
				select top(1) @dbId = id,@dbContrasenia = password,@dbBloqueo = bloqueado,@dbIntentos = intentosRestantes,@dbPrimerIngreso = primerIngreso,@dbCambioContrasenia = cambioContrasenia  from sistema.datos_usuarios where username = @txtUsername and estado = 1;
				if @dbContrasenia = @txtContrasenia
					begin
						if @dbIntentos > 0
							begin
								if @dbBloqueo = 0
									begin
										if @dbPrimerIngreso = 1 set @dbError = 'primerIngreso';
									end
								else
									begin
										set @dbError = 'usuarioBloqueado';
									end
							end
						else
							begin
								set @dbError = 'bloqueadoIntentosFallidos';
							end
					end
				else
					begin
						if @dbCambioContrasenia = 1 and @dbBloqueo = 0
							begin
								select top(1) @dbContrasenia = contrasenia,@dbFechaSolicitud = fechaRegistro from sistema.datos_restablecimientosContrasenia where idUsuario = @dbId and estado = 1 and fechaUso is null order by fechaRegistro desc;
								if @dbContrasenia = @txtContrasenia
									begin
										set @dbFechaSolicitud = DATEADD(day,1,@dbFechaSolicitud);
										if @dbFechaSolicitud >= cast(getdate() as datetime)
											begin
												set @dbError = 'cambioContrasenia';
											end
									end
							end

						if @dbError is null
							begin
								set @dbIntentos = @dbIntentos -1;
								if @dbIntentos < 0 set @dbIntentos = 0;

								if @dbIntentos > 0
									begin
										set @dbError = 'contraseniaIncorrecta';
									end
								else
									begin
										set @dbError = 'bloqueadoIntentosFallidos';
									end		
								update sistema.datos_usuarios set intentosRestantes = @dbIntentos where id = @dbId;
							end
					end
			end
		else
			begin
				set @dbError = 'noEncontrado';
			end

		set @dbResponse = ISNULL(@dbError,'success');
		commit tran autenticarUsuario
	end try
	begin catch
		SET @dbResponse = 'Ocurrió el siguiente error: '+ERROR_MESSAGE()+', en la línea '+ CONVERT ( NVARCHAR ( 255 ), ERROR_LINE( ) );
		rollback tran autenticarUsuario
	end catch
end