# -*- coding: utf-8 -*-
'''
VirtualBox Guest Additions installer state
'''
from __future__ import absolute_import

# Import python libs
import logging

log = logging.getLogger(__name__)


def additions_installed(name, reboot=False, upgrade_os=False):
    '''
    Ensure that the VirtualBox Guest Additions are installed. Uses the CD,
    connected by VirtualBox.

    name
        The name has no functional value and is only used as a tracking
        reference.
    reboot : False
        Restart OS to complete installation.
    upgrade_os : False
        Upgrade OS (to ensure the latests version of kernel and developer tools
        installed).
    '''
    ret = {'name': name, 'changes': {}, 'result': False, 'comment': ''}
    current_state = __salt__['vbox_guest.additions_version']()
    if current_state:
        ret['result'] = True
        ret['comment'] = 'System already in the correct state'
        return ret
    if __opts__['test']:
        ret['comment'] = ('The state of VirtualBox Guest Additions will be '
                          'changed.')
        ret['changes'] = {
            'old': current_state,
            'new': True,
        }
        ret['result'] = None
        return ret

    new_state = __salt__['vbox_guest.additions_install'](
        reboot=reboot, upgrade_os=upgrade_os)

    ret['comment'] = 'The state of VirtualBox Guest Additions was changed!'
    ret['changes'] = {
        'old': current_state,
        'new': new_state,
    }
    ret['result'] = bool(new_state)
    return ret


def additions_removed(name, force=False):
    '''
    Ensure that the VirtualBox Guest Additions are removed. Uses the CD,
    connected by VirtualBox.

    To connect VirtualBox Guest Additions via VirtualBox graphical interface
    press 'Host+D' ('Host' is usually 'Right Ctrl').

    name
        The name has no functional value and is only used as a tracking
        reference.
    force
        Force VirtualBox Guest Additions removing.
    '''
    ret = {'name': name, 'changes': {}, 'result': False, 'comment': ''}
    current_state = __salt__['vbox_guest.additions_version']()
    if not current_state:
        ret['result'] = True
        ret['comment'] = 'System already in the correct state'
        return ret
    if __opts__['test']:
        ret['comment'] = ('The state of VirtualBox Guest Additions will be '
                          'changed.')
        ret['changes'] = {
            'old': current_state,
            'new': True,
        }
        ret['result'] = None
        return ret

    new_state = __salt__['vbox_guest.additions_remove'](force=force)

    ret['comment'] = 'The state of VirtualBox Guest Additions was changed!'
    ret['changes'] = {
        'old': current_state,
        'new': new_state,
    }
    ret['result'] = bool(new_state)
    return ret


def grant_access_to_shared_folders_to(name, users=None):
    '''
    Grant access to auto-mounted shared folders to the users.

    User is specified by it's name. To grant access for several users use
    argument `users`.

    name
        Name of the user to grant access to auto-mounted shared folders to.
    users
        List of names of users to grant access to auto-mounted shared folders to.
        If specified, `name` will not be taken into account.
    '''
    ret = {'name': name, 'changes': {}, 'result': False, 'comment': ''}
    current_state = __salt__['vbox_guest.list_shared_folders_users']()
    if users is None:
        users = [name]
    if current_state == users:
        ret['result'] = True
        ret['comment'] = 'System already in the correct state'
        return ret
    if __opts__['test']:
        ret['comment'] = ('List of users who have access to auto-mounted '
                          'shared folders will be changed')
        ret['changes'] = {
            'old': current_state,
            'new': users,
        }
        ret['result'] = None
        return ret

    new_state = __salt__['vbox_guest.grant_access_to_shared_folders_to'](
        name=name, users=users)

    ret['comment'] = ('List of users who have access to auto-mounted shared '
                      'folders was changed')
    ret['changes'] = {
        'old': current_state,
        'new': new_state,
    }
    ret['result'] = True
    return ret
