# -*- coding: utf-8 -*-
'''
Salt modules to work with the Architect service.
'''

# Import python libs
from __future__ import absolute_import
import yaml
from architect_client.libarchitect import ArchitectClient
import logging

__virtualname__ = 'architect'

logger = logging.getLogger(__name__)


def __virtual__():
    return __virtualname__


def _client():
    return ArchitectClient()


def get_inventory():
    '''
    Get the Architect metadata inventory for given Salt master.

    CLI Examples:

    .. code-block:: bash

        salt-call architect.get_inventory
    '''
    data = yaml.load(_client().get_data())

    return data


def get_node(name):
    '''
    Get the Architect node metadata for given Salt master.

    CLI Examples:

    .. code-block:: bash

        salt-call architect.get_node node.domain
    '''

    data = yaml.load(_client().get_data(name))

    return {
        name: data
    }


def collect_minion_info():
    '''
    Get Salt minion metadata and forward it to the Architect master.

    CLI Examples:

    .. code-block:: bash

        salt-call architect.collect_minion_info
    '''

    data = {
        'pillar': __salt__['pillar.data'](),
        'grain': __salt__['grains.items'](),
        'lowstate': __salt__['state.show_lowstate'](),
    }
    output = _client().push_salt_minion({data['grain']['id']: data})
    return output
