# -*- coding: utf-8 -*-
'''
Management of gerrit projects
==============================

:depends:   - gerritlib Python module
:configuration: See :py:mod:`salt.modules.gerrit` for setup instructions.

.. code-block:: yaml

    gerrit project:
      gerrit.project_present:
      - name: gerrit project

'''


def __virtual__():
    '''
    Only load if the gerrit module is in __salt__
    '''
    return 'gerrit' if 'gerrit.account_create' in __salt__ else False


def account_present(name, fullname, email=None, active=None, groups=[], ssh_key=None, http_password=None, **kwargs):
    '''
    Ensures that the gerrit account exists
    
    :param name: username
    :param fullname: fullname
    :param email: email
    :param active: active
    :param groups: array of strings
        groups:
            - Non-Interactive Users
            - Testers
    :param ssh_key: public ssh key
    :param http_password: http password

    '''
    ret = {'name': name,
           'changes': {},
           'result': True,
           'comment': 'Account "{0}" already exists'.format(name)}

    # Check if account is already present
    account = __salt__['gerrit.account_get'](name, **kwargs)

    if 'Error' not in account:
        #update account
        pass
    else:
        # Create account
        __salt__['gerrit.account_create'](name, fullname, email, active, groups, ssh_key, http_password, **kwargs)
        ret['comment'] = 'Account "{0}" has been added'.format(name)
        ret['changes']['Account'] = 'Created'
    return ret


def group_present(name, description=None, **kwargs):
    '''
    Ensures that the gerrit group exists
    
    :param name: group name
    '''
    ret = {'name': name,
           'changes': {},
           'result': True,
           'comment': 'Group "{0}" already exists'.format(name)}

    # Check if group is already present
    group = __salt__['gerrit.group_get'](name, **kwargs)

    if 'Error' not in group:
        #update group
        pass
    else:
        # Create group
        __salt__['gerrit.group_create'](name, description, **kwargs)
        ret['comment'] = 'Group "{0}" has been added'.format(name)
        ret['changes']['Group'] = 'Created'
    return ret


def project_present(name, description=None, **kwargs):
    '''
    Ensures that the gerrit project exists
    
    :param name: project name
    :param description: short project description
    '''
    ret = {'name': name,
           'changes': {},
           'result': True,
           'comment': 'Project "{0}" already exists'.format(name)}

    # Check if project is already present
    project = __salt__['gerrit.project_get'](name=name, **kwargs)

    if 'Error' not in project:
        #update project
        pass
    else:
        # Create project
        __salt__['gerrit.project_create'](name, **kwargs)
        ret['comment'] = 'Project "{0}" has been added'.format(name)
        ret['changes']['Project'] = 'Created'
    return ret
