import re
from datetime import datetime

from django.core.checks import Tags, Warning, register

from dbbackup import settings

W001 = Warning(
    "Invalid HOSTNAME parameter",
    hint="Set a non empty string to this settings.DBBACKUP_HOSTNAME",
    id="dbbackup.W001",
)
W002 = Warning(
    "Invalid STORAGE parameter",
    hint="Set a valid path to a storage in settings.DBBACKUP_STORAGE",
    id="dbbackup.W002",
)
W003 = Warning(
    "Invalid FILENAME_TEMPLATE parameter",
    hint="Include {datetime} to settings.DBBACKUP_FILENAME_TEMPLATE",
    id="dbbackup.W003",
)
W004 = Warning(
    "Invalid MEDIA_FILENAME_TEMPLATE parameter",
    hint="Include {datetime} to settings.DBBACKUP_MEDIA_FILENAME_TEMPLATE",
    id="dbbackup.W004",
)
W005 = Warning(
    "Invalid DATE_FORMAT parameter",
    hint="settings.DBBACKUP_DATE_FORMAT can contain only [A-Za-z0-9%_-]",
    id="dbbackup.W005",
)
W006 = Warning(
    "FAILURE_RECIPIENTS has been deprecated",
    hint="settings.DBBACKUP_FAILURE_RECIPIENTS is replaced by "
    "settings.DBBACKUP_ADMINS",
    id="dbbackup.W006",
)
W007 = Warning(
    "Invalid FILENAME_TEMPLATE parameter",
    hint="settings.DBBACKUP_FILENAME_TEMPLATE must not contain slashes ('/'). "
    "Did you mean to change the value for 'location'?",
    id="dbbackup.W007",
)
W008 = Warning(
    "Invalid MEDIA_FILENAME_TEMPLATE parameter",
    hint="settings.DBBACKUP_MEDIA_FILENAME_TEMPLATE must not contain slashes ('/')"
    "Did you mean to change the value for 'location'?",
    id="dbbackup.W007",
)


def check_filename_templates():
    return _check_filename_template(
        settings.FILENAME_TEMPLATE,
        W007,
        "db",
    ) + _check_filename_template(
        settings.MEDIA_FILENAME_TEMPLATE,
        W008,
        "media",
    )


def _check_filename_template(filename_template, check_code, content_type) -> list:
    if callable(filename_template):
        params = {
            "servername": "localhost",
            "datetime": datetime.now().strftime(settings.DATE_FORMAT),
            "databasename": "default",
            "extension": "dump",
            "content_type": content_type,
        }
        filename_template = filename_template(params)

    if "/" in filename_template:
        return [check_code]
    return []


@register(Tags.compatibility)
def check_settings(app_configs, **kwargs):
    errors = []
    if not settings.HOSTNAME:
        errors.append(W001)

    if not settings.STORAGE or not isinstance(settings.STORAGE, str):
        errors.append(W002)

    if (
        not callable(settings.FILENAME_TEMPLATE)
        and "{datetime}" not in settings.FILENAME_TEMPLATE
    ):
        errors.append(W003)

    if (
        not callable(settings.MEDIA_FILENAME_TEMPLATE)
        and "{datetime}" not in settings.MEDIA_FILENAME_TEMPLATE
    ):
        errors.append(W004)

    if re.search(r"[^A-Za-z0-9%_-]", settings.DATE_FORMAT):
        errors.append(W005)

    if getattr(settings, "FAILURE_RECIPIENTS", None) is not None:
        errors.append(W006)

    errors += check_filename_templates()

    return errors
