from django.dispatch import Signal, receiver

from baserow.contrib.database.fields import signals as field_signals
from baserow.contrib.database.fields.models import FileField

from .models import GalleryView

view_loaded = Signal()
view_created = Signal()
view_updated = Signal()
view_deleted = Signal()
views_reordered = Signal()
form_submitted = Signal()

view_filter_created = Signal()
view_filter_updated = Signal()
view_filter_deleted = Signal()

view_filter_group_created = Signal()
view_filter_group_updated = Signal()
view_filter_group_deleted = Signal()

view_sort_created = Signal()
view_sort_updated = Signal()
view_sort_deleted = Signal()

view_group_by_created = Signal()
view_group_by_updated = Signal()
view_group_by_deleted = Signal()

view_decoration_created = Signal()
view_decoration_updated = Signal()
view_decoration_deleted = Signal()

view_field_options_updated = Signal()


@receiver(field_signals.field_deleted)
def field_deleted(sender, field, **kwargs):
    if isinstance(field, FileField):
        GalleryView.objects.filter(card_cover_image_field_id=field.id).update(
            card_cover_image_field_id=None
        )

    from baserow.contrib.database.views.registries import (
        decorator_value_provider_type_registry,
    )

    # Call value provider type hooks
    for (
        decorator_value_provider_type
    ) in decorator_value_provider_type_registry.get_all():
        decorator_value_provider_type.after_field_delete(field)

    from baserow.contrib.database.views.handler import ViewIndexingHandler

    ViewIndexingHandler.after_field_changed_or_deleted(field)


@receiver([view_sort_created, view_sort_updated, view_sort_deleted])
def update_view_index_if_view_sort_changes(sender, view_sort, **kwargs):
    from baserow.contrib.database.views.handler import ViewIndexingHandler

    ViewIndexingHandler.schedule_index_update(view_sort.view)


@receiver(
    [
        view_group_by_created,
        view_group_by_updated,
        view_group_by_deleted,
    ]
)
def update_view_index_if_view_group_by_changes(sender, view_group_by, **kwargs):
    from baserow.contrib.database.views.handler import ViewIndexingHandler

    ViewIndexingHandler.schedule_index_update(view_group_by.view)


@receiver(view_loaded)
def view_loaded_create_indexes_and_columns(sender, view, table_model, **kwargs):
    from baserow.contrib.database.table.tasks import (
        setup_created_by_and_last_modified_by_column,
    )
    from baserow.contrib.database.views.handler import ViewIndexingHandler

    ViewIndexingHandler.schedule_index_creation_if_needed(view, table_model)

    table = view.table
    if not table.last_modified_by_column_added or not table.created_by_column_added:
        setup_created_by_and_last_modified_by_column.delay(table_id=view.table.id)
