# Copyright (c) 2013 Shotgun Software Inc.
#
# CONFIDENTIAL AND PROPRIETARY
#
# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit
# Source Code License included in this distribution package. See LICENSE.
# By accessing, using, copying or modifying this work you indicate your
# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
# not expressly granted therein are reserved by Shotgun Software Inc.
"""
Helper methods that extracts information about the current user.
"""
import os
import sys
from . import constants
from .platforms import is_windows
def get_login_name():
    """
    Retrieves the login name of the current user.
    Returns None if no login name was found
    """
    if is_windows():
        # http://stackoverflow.com/questions/117014/how-to-retrieve-name-of-current-windows-user-ad-or-local-using-python
        return os.environ.get("USERNAME", None)
    else:
        try:
            import pwd
            pwd_entry = pwd.getpwuid(os.geteuid())
            return pwd_entry[0]
        except:
            return None
# note! Because the shotgun caching method can return None, to indicate that no
# user was found, we cannot use a None value to indicate that the cache has not been
# populated.
g_shotgun_user_cache = "unknown"
g_shotgun_current_user_cache = "unknown"
def get_shotgun_user(sg):
    """
    ---- DEPRECATED ---- user get_current_user(tk) instead
    Retrieves a shotgun user dict
    for the current user. Returns None if the user is not found in shotgun.
    Returns the following fields:
    * id
    * type
    * email
    * login
    * name
    * image (thumbnail)
    This method connects to shotgun.
    """
    global g_shotgun_user_cache
    if g_shotgun_user_cache == "unknown":
        fields = ["id", "type", "email", "login", "name", "image"]
        local_login = get_login_name()
        g_shotgun_user_cache = sg.find_one(
            "HumanUser", filters=[["login", "is", local_login]], fields=fields
        )
    return g_shotgun_user_cache
[docs]def get_current_user(tk):
    """
    Retrieves the current user as a dictionary of metadata values. Note: This method connects to
    shotgun the first time around. The result is then cached to reduce latency.
    If a user has been authenticated via a login prompt, this method will return the credentials
    associated with that user. If Toolkit has been configured to use a script user to connect to
    Shotgun, a core hook will be executed to established which user is associated with the current
    session. This is usually based on the currently logged in user.
    :returns: None if the user is not found in Shotgun. Otherwise, it returns a dictionary
              with the following fields: id, type, email, login, name, image, firstname, lastname
    """
    global g_shotgun_current_user_cache
    if g_shotgun_current_user_cache != "unknown":
        return g_shotgun_current_user_cache
    # Avoids cyclic imports.
    from .. import api
    user = api.get_authenticated_user()
    # If an authenticated user has been set and it has a name, just use that as login for the
    # Shotgun query. If there is no user, that's probably because we're running in an old
    # script that doesn't use the authenticated user concept. In that case, we'll do what we've
    # always been doing in the past, which is run the hook. Obviously, if the user didn't
    # have a login name (which happens when the authenticated user is a script user), we'll also run
    # the hook as well.
    if user and user.login:
        current_login = user.login
    else:
        current_login = tk.execute_core_hook(constants.CURRENT_LOGIN_HOOK_NAME)
    if current_login is None:
        g_shotgun_current_user_cache = None
    else:
        fields = [
            "id",
            "type",
            "email",
            "login",
            "name",
            "image",
            "firstname",
            "lastname",
        ]
        g_shotgun_current_user_cache = tk.shotgun.find_one(
            "HumanUser", filters=[["login", "is", current_login]], fields=fields
        )
    return g_shotgun_current_user_cache