# standard imports
import logging
from typing import Tuple

# local imports
from cic_ussd.db.models.user import User
from cic_ussd.operations import save_to_in_memory_ussd_session_data

logg = logging.getLogger(__file__)


def change_preferred_language_to_en(state_machine_data: Tuple[str, dict, User]):
    """This function changes the user's preferred language to english.
    :param state_machine_data: A tuple containing user input, a ussd session and user object.
    :type state_machine_data: tuple
    """
    user_input, ussd_session, user = state_machine_data
    user.preferred_language = 'en'
    User.session.add(user)
    User.session.commit()


def change_preferred_language_to_sw(state_machine_data: Tuple[str, dict, User]):
    """This function changes the user's preferred language to swahili.
    :param state_machine_data: A tuple containing user input, a ussd session and user object.
    :type state_machine_data: tuple
    """
    user_input, ussd_session, user = state_machine_data
    user.preferred_language = 'sw'
    User.session.add(user)
    User.session.commit()


def update_account_status_to_active(state_machine_data: Tuple[str, dict, User]):
    """This function sets user's account to active.
    :param state_machine_data: A tuple containing user input, a ussd session and user object.
    :type state_machine_data: tuple
    """
    user_input, ussd_session, user = state_machine_data
    user.activate_account()
    User.session.add(user)
    User.session.commit()


def save_profile_attribute_to_session_data(state_machine_data: Tuple[str, dict, User]):
    """This function saves first name data to the ussd session in the redis cache.
    :param state_machine_data: A tuple containing user input, a ussd session and user object.
    :type state_machine_data: tuple
    """
    user_input, ussd_session, user = state_machine_data

    # get current menu
    current_state = ussd_session.get('state')

    # define session data key from current state
    key = ''
    if 'first_name' in current_state:
        key = 'first_name'
    elif 'last_name' in current_state:
        key = 'last_name'
    elif 'gender' in current_state:
        key = 'gender'
    elif 'location' in current_state:
        key = 'location'
    elif 'business_profile' in current_state:
        key = 'business_profile'

    # check if there is existing session data
    if ussd_session.get('session_data'):
        session_data = ussd_session.get('session_data')
        session_data[key] = user_input
    else:
        session_data = {
            key: user_input
        }
    save_to_in_memory_ussd_session_data(queue='cic-ussd', session_data=session_data, ussd_session=ussd_session)


def persist_profile_data(state_machine_data: Tuple[str, dict, User]):
    """This function persists elements of the user profile stored in session data
    :param state_machine_data: A tuple containing user input, a ussd session and user object.
    :type state_machine_data: tuple
    """
    user_input, ussd_session, user = state_machine_data

    # get session data
    profile_data = ussd_session.get('session_data')
    logg.debug('This section requires implementation of user metadata.')