"""Manifest validation."""
from typing import Dict

import voluptuous as vol
from voluptuous.humanize import humanize_error

from .model import Integration


MANIFEST_SCHEMA = vol.Schema({
    vol.Required('domain'): str,
    vol.Required('name'): str,
    vol.Optional('config_flow'): bool,
    vol.Optional('zeroconf'): [str],
    vol.Optional('ssdp'): vol.Schema({
        vol.Optional('st'): [str],
        vol.Optional('manufacturer'): [str],
        vol.Optional('device_type'): [str],
    }),
    vol.Optional('homekit'): vol.Schema({
        vol.Optional('models'): [str],
    }),
    vol.Required('documentation'): str,
    vol.Required('requirements'): [str],
    vol.Required('dependencies'): [str],
    vol.Optional('after_dependencies'): [str],
    vol.Required('codeowners'): [str],
})


def validate_manifest(integration: Integration):
    """Validate manifest."""
    try:
        MANIFEST_SCHEMA(integration.manifest)
    except vol.Invalid as err:
        integration.add_error(
            'manifest',
            "Invalid manifest: {}".format(
                humanize_error(integration.manifest, err)))
        integration.manifest = None
        return

    if integration.manifest['domain'] != integration.path.name:
        integration.add_error('manifest', 'Domain does not match dir name')


def validate(integrations: Dict[str, Integration], config):
    """Handle all integrations manifests."""
    for integration in integrations.values():
        if integration.manifest:
            validate_manifest(integration)