"""Search indexes app signals."""
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_elasticsearch_dsl.registries import registry


@receiver(post_save)
def update_document(sender, **kwargs):
    from establishment.models import Establishment
    app_label = sender._meta.app_label
    model_name = sender._meta.model_name
    instance = kwargs['instance']

    app_label_model_name_to_filter = {
        ('location', 'country'): 'address__city__country',
        ('location', 'city'): 'address__city',
        ('location', 'address'): 'address',
        # todo: remove after migration
        ('establishment', 'establishmenttype'): 'establishment_type',
        ('establishment', 'establishmentsubtype'): 'establishment_subtypes',
        ('tag', 'tag'): 'tags',
    }
    filter_name = app_label_model_name_to_filter.get((app_label, model_name))
    if filter_name:
        qs = Establishment.objects.filter(**{filter_name: instance})
        for product in qs:
            registry.update(product)


@receiver(post_save)
def update_news(sender, **kwargs):
    from news.models import News
    app_label = sender._meta.app_label
    model_name = sender._meta.model_name
    instance = kwargs['instance']
    app_label_model_name_to_filter = {
        ('location', 'country'): 'country',
        ('news', 'newstype'): 'news_type',
        ('tag', 'tag'): 'tags',
    }
    filter_name = app_label_model_name_to_filter.get((app_label, model_name))
    if filter_name:
        qs = News.objects.filter(**{filter_name: instance})
        for product in qs:
            registry.update(product)


@receiver(post_save)
def update_product(sender, **kwargs):
    from product.models import Product
    app_label = sender._meta.app_label
    model_name = sender._meta.model_name
    instance = kwargs['instance']
    app_label_model_name_to_filter = {
        ('product', 'productstandard'): 'standards',
        ('product', 'producttype'): 'product_type',
        ('tag', 'tag'): 'tags',
        # ('location', 'wineregion'): 'wine_region',
        # ('location', 'winesubregion'): 'wine_sub_region',
        # ('location', 'winevillage'): 'wine_village',
        ('establishment', 'establishment'): 'establishment',
    }
    filter_name = app_label_model_name_to_filter.get((app_label, model_name))
    if filter_name:
        qs = Product.objects.filter(**{filter_name: instance})
        for product in qs:
            registry.update(product)
