"""
homeassistant.components.shell_command
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Exposes regular shell commands as services.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/shell_command/
"""
import logging
import subprocess

from homeassistant.util import slugify

DOMAIN = 'shell_command'

_LOGGER = logging.getLogger(__name__)


def setup(hass, config):
    """ Sets up the shell_command component. """
    conf = config.get(DOMAIN)

    if not isinstance(conf, dict):
        _LOGGER.error('Expected configuration to be a dictionary')
        return False

    for name in conf.keys():
        if name != slugify(name):
            _LOGGER.error('Invalid service name: %s. Try %s',
                          name, slugify(name))
            return False

    def service_handler(call):
        """ Execute a shell command service. """
        try:
            subprocess.call(conf[call.service], shell=True,
                            stdout=subprocess.DEVNULL,
                            stderr=subprocess.DEVNULL)
        except subprocess.SubprocessError:
            _LOGGER.exception('Error running command')

    for name in conf.keys():
        hass.services.register(DOMAIN, name, service_handler)

    return True
