from django.db import models
from django.db.models import Q
from django.utils.encoding import force_str

from cms.models import CMSPlugin, Placeholder


class AliasPluginModel(CMSPlugin):
    """
    AliasPlugin is deprecated,
    and it will be removed;
    please use the package djangocms-alias instead
    """
    cmsplugin_ptr = models.OneToOneField(
        CMSPlugin,
        on_delete=models.CASCADE,
        related_name='cms_aliasplugin',
        parent_link=True,
    )
    plugin = models.ForeignKey(
        CMSPlugin,
        on_delete=models.CASCADE,
        editable=False,
        related_name='alias_reference',
        null=True,
    )
    alias_placeholder = models.ForeignKey(
        Placeholder,
        on_delete=models.CASCADE,
        editable=False,
        related_name='alias_placeholder',
        null=True,
    )

    class Meta:
        app_label = 'cms'

    def __str__(self):
        if self.plugin_id:
            return f"({force_str(self.plugin.get_plugin_name())}) {self.plugin.get_plugin_instance()[0]}"
        else:
            return force_str(self.alias_placeholder.get_label())

    def get_aliased_placeholder_id(self):
        if self.plugin_id:
            placeholder_id = self.plugin.placeholder_id
        else:
            placeholder_id = self.alias_placeholder_id
        return placeholder_id

    def is_recursive(self):
        placeholder_id = self.get_aliased_placeholder_id()

        if not placeholder_id:
            return False

        plugins = AliasPluginModel.objects.filter(
            plugin_type='AliasPlugin',
            placeholder_id=placeholder_id,
        )
        plugins = plugins.filter(
            Q(plugin=self) | Q(plugin__placeholder=self.placeholder_id) | Q(alias_placeholder=self.placeholder_id)
        )
        return plugins.exists()
