import re

from django.forms import ValidationError
from django.utils.translation import gettext as _

FILENAME_CONTENT = re.compile(r"([a-zA-Z0-9]|\.|_|-)+")
FILENAME_TANGIBILITY = re.compile(r"[a-zA-Z0-9]")


def validate_css_name(filename):
    if not filename.lower().endswith(".css"):
        raise ValidationError(_("Name is missing an .css extension."))

    if filename.startswith("."):
        raise ValidationError(_('Name can\'t start with period (".").'))

    if not FILENAME_CONTENT.fullmatch(filename[:-4]):
        raise ValidationError(
            _(
                "Name can contain only latin alphabet characters, "
                "digits, dots, underscores and dashes."
            )
        )

    if not FILENAME_TANGIBILITY.match(filename[:-4]):
        raise ValidationError(
            _("Name has to contain at least one latin alphabet character or digit.")
        )


def validate_css_name_is_available(instance, name):
    queryset = instance.theme.css.filter(name=name)
    if instance.pk:
        queryset = queryset.exclude(pk=instance.pk)
    if queryset.exists():
        raise ValidationError(_("This name is already in use by other asset."))