# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.    
#
#  $Id$
#

import sys
import os 

from usermanagementinterface import UserManagementInterface
import time
def timeF(f):
	def myF(*args, **kw):
		start = time.time()
		res = f(*args, **kw)
		end = time.time()
		print "%s took %f" % (f.__name__, end-start)
		return res
	myF.__name__ = f.__name__
	return myF

class ldap(UserManagementInterface):
	#@timeF
	def __init__(self):
		self.userCache = {}
		self.userCacheForward = {}
		self.userCacheReverse= {}
		cmd = "getent passwd "
		a = os.popen(cmd)
		for user in a.readlines():
			uid = int(user.split(":")[2])
			username = user.split(":")[0]
			name = user.split(":")[4]
			self.userCacheForward[username] = self.userCacheForward.get(username, {})
			self.userCacheForward[username]['name'] = self.userCacheForward[username].get("name", name) 
			self.userCacheForward[username]['uid'] = self.userCacheForward[username].get("uid", uid) 

			self.userCacheReverse[uid] = self.userCacheReverse.get(uid, {})
			self.userCacheReverse[uid]['name'] = self.userCacheReverse.get('name', name)
			self.userCacheReverse[uid]['username']  = self.userCacheReverse.get('username', username)

	def getUserId(self, userName):
		#cmd = "getent passwd | grep " + userName	
		#a = os.popen(cmd)
		#idlist = []
		#for user in a.readlines():
			#if userName in user:
				#idlist.append(user.split(":")[2])
		
		val = self.userCacheForward.get(userName)
		if val:
			return val['uid']
		return val['username']

		#if len(set(idlist)) == 0:
			#mesg = "ERROR:  User " + userName + " does not exist\n"
			#sys.stderr.write(mesg)
			#exit()
		#elif len(set(idlist)) == 1:
			#return idlist[0]
		#else:
			#print idlist
			#mesg = "ERROR:  Multiple entries exist!  Choose one and use the --uid option"
			#sys.stderr.write(mesg)
			#exit()

	def getUserName(self, userId):

		#  Check the cache
		val = self.userCacheReverse.get(userId)
		if val:
			return val['username']
		return userId
		
		'''  the old way
		val = self.userCache.get(userId)
		if val:
			return self.userCache[userId]

		cmd = "getent passwd | grep " + str(userId)
		a = os.popen(cmd)
		idlist = []
		for user in a.readlines():
			idlist.append(user.split(":")[0])
		
		if len(idlist) > 0:
			#  Cache the info to speed things up
			self.userCache[userId] = idlist[0]

			return idlist[0]		

		return userId
		'''

	def getGroupId(self):
		pass

class files(UserManagementInterface):
	def __init__(self):
		raise NotImplementedError


	def getUserId(self):
		raise NotImplementedError

	def getGroupId(self):
		raise NotImplementedError
