#!/usr/bin/env python

from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.cli.dmCli import DmCli
from dm.common.utility.ldapUserManager import LdapUserManager
from dm.aps_user_db.api.apsUserDbApi import ApsUserDbApi

class UpdateUserFromApsDbCli(DmCli):
    def __init__(self):
        DmCli.__init__(self)
        self.addOption('', '--badge', dest='badge', help='User badge number.')

    def checkArgs(self):
        if self.options.badge is None:
            raise InvalidRequest('Badge number must be provided.')

    def getBadge(self):
        return self.options.badge

    def runCommand(self):
        self.parseArgs(usage="""
    dm-update-user-from-aps-db --badge=BADGE

Description:
    Updates user in DM LDAP and database using information from APS DB. 
        """)
        self.checkArgs()
        apsUserDbApi = ApsUserDbApi()
        badgeNumber = self.getBadge()
        username = 'd%s' % badgeNumber
        apsUser = apsUserDbApi.getApsUserByBadgeNumber(badgeNumber)
        print 'APS User Info: ', apsUser.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())
        ldapUserManager = LdapUserManager('ldaps://dmid-vm.xray.aps.anl.gov:636', 'uid=dmadmin,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', '/tmp/ldapPassword', userDnFormat='uid=%s,ou=DM,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', groupDnFormat='cn=%s,ou=DM,ou=Group,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', minGidNumber=66000)
        ldapUser = ldapUserManager.getUserInfo(username)
        print 'Old LDAP User Info: ', ldapUser
        attrDict = {}
        attrDict['gecos'] = apsUser['name']
        attrDict['userPassword'] = apsUser['passwordHashValue']
        ldapUserManager.modifyUserInfo(username, attrDict)
        ldapUser = ldapUserManager.getUserInfo(username)
        print 'New LDAP User Info: ', ldapUser

#######################################################################
# Run command.
if __name__ == '__main__':
    cli = UpdateUserFromApsDbCli()
    cli.run()