from datetime import date, datetime

from paradoxdjango.conf.urls.i18n import i18n_patterns
from paradoxdjango.contrib.sitemaps import GenericSitemap, Sitemap, views
from paradoxdjango.http import HttpResponse
from paradoxdjango.urls import path
from paradoxdjango.utils import timezone
from paradoxdjango.views.decorators.cache import cache_page

from ..models import I18nTestModel, TestModel


class SimpleSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    location = "/location/"
    lastmod = datetime.now()

    def items(self):
        return [object()]


class SimplePagedSitemap(Sitemap):
    def items(self):
        return [object() for x in range(Sitemap.limit + 1)]


class SimpleI18nSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    i18n = True

    def items(self):
        return I18nTestModel.objects.order_by("pk").all()


class AlternatesI18nSitemap(SimpleI18nSitemap):
    alternates = True


class LimitedI18nSitemap(AlternatesI18nSitemap):
    languages = ["en", "es"]


class XDefaultI18nSitemap(AlternatesI18nSitemap):
    x_default = True


class EmptySitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    location = "/location/"


class FixedLastmodSitemap(SimpleSitemap):
    lastmod = datetime(2013, 3, 13, 10, 0, 0)


class FixedLastmodMixedSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    location = "/location/"
    loop = 0

    def items(self):
        o1 = TestModel()
        o1.lastmod = datetime(2013, 3, 13, 10, 0, 0)
        o2 = TestModel()
        return [o1, o2]


class FixedNewerLastmodSitemap(SimpleSitemap):
    lastmod = datetime(2013, 4, 20, 5, 0, 0)


class DateSiteMap(SimpleSitemap):
    lastmod = date(2013, 3, 13)


class TimezoneSiteMap(SimpleSitemap):
    lastmod = datetime(2013, 3, 13, 10, 0, 0, tzinfo=timezone.get_fixed_timezone(-300))


def testmodelview(request, id):
    return HttpResponse()


simple_sitemaps = {
    "simple": SimpleSitemap,
}

simple_i18n_sitemaps = {
    "i18n": SimpleI18nSitemap,
}

alternates_i18n_sitemaps = {
    "i18n-alternates": AlternatesI18nSitemap,
}

limited_i18n_sitemaps = {
    "i18n-limited": LimitedI18nSitemap,
}

xdefault_i18n_sitemaps = {
    "i18n-xdefault": XDefaultI18nSitemap,
}

simple_sitemaps_not_callable = {
    "simple": SimpleSitemap(),
}

simple_sitemaps_paged = {
    "simple": SimplePagedSitemap,
}

empty_sitemaps = {
    "empty": EmptySitemap,
}

fixed_lastmod_sitemaps = {
    "fixed-lastmod": FixedLastmodSitemap,
}

fixed_lastmod_mixed_sitemaps = {
    "fixed-lastmod-mixed": FixedLastmodMixedSitemap,
}

sitemaps_lastmod_mixed_ascending = {
    "no-lastmod": EmptySitemap,
    "lastmod": FixedLastmodSitemap,
}

sitemaps_lastmod_mixed_descending = {
    "lastmod": FixedLastmodSitemap,
    "no-lastmod": EmptySitemap,
}

sitemaps_lastmod_ascending = {
    "date": DateSiteMap,
    "datetime": FixedLastmodSitemap,
    "datetime-newer": FixedNewerLastmodSitemap,
}

sitemaps_lastmod_descending = {
    "datetime-newer": FixedNewerLastmodSitemap,
    "datetime": FixedLastmodSitemap,
    "date": DateSiteMap,
}

generic_sitemaps = {
    "generic": GenericSitemap({"queryset": TestModel.objects.order_by("pk").all()}),
}

generic_sitemaps_lastmod = {
    "generic": GenericSitemap(
        {
            "queryset": TestModel.objects.order_by("pk").all(),
            "date_field": "lastmod",
        }
    ),
}

urlpatterns = [
    path("simple/index.xml", views.index, {"sitemaps": simple_sitemaps}),
    path("simple-paged/index.xml", views.index, {"sitemaps": simple_sitemaps_paged}),
    path(
        "simple-not-callable/index.xml",
        views.index,
        {"sitemaps": simple_sitemaps_not_callable},
    ),
    path(
        "simple/custom-index.xml",
        views.index,
        {"sitemaps": simple_sitemaps, "template_name": "custom_sitemap_index.xml"},
    ),
    path(
        "simple/sitemap-<section>.xml",
        views.sitemap,
        {"sitemaps": simple_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "simple/sitemap.xml",
        views.sitemap,
        {"sitemaps": simple_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "simple/i18n.xml",
        views.sitemap,
        {"sitemaps": simple_i18n_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "alternates/i18n.xml",
        views.sitemap,
        {"sitemaps": alternates_i18n_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "limited/i18n.xml",
        views.sitemap,
        {"sitemaps": limited_i18n_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "x-default/i18n.xml",
        views.sitemap,
        {"sitemaps": xdefault_i18n_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "simple/custom-sitemap.xml",
        views.sitemap,
        {"sitemaps": simple_sitemaps, "template_name": "custom_sitemap.xml"},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "empty/sitemap.xml",
        views.sitemap,
        {"sitemaps": empty_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod/sitemap.xml",
        views.sitemap,
        {"sitemaps": fixed_lastmod_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod-mixed/sitemap.xml",
        views.sitemap,
        {"sitemaps": fixed_lastmod_mixed_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod/date-sitemap.xml",
        views.sitemap,
        {"sitemaps": {"date-sitemap": DateSiteMap}},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod/tz-sitemap.xml",
        views.sitemap,
        {"sitemaps": {"tz-sitemap": TimezoneSiteMap}},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod-sitemaps/mixed-ascending.xml",
        views.sitemap,
        {"sitemaps": sitemaps_lastmod_mixed_ascending},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod-sitemaps/mixed-descending.xml",
        views.sitemap,
        {"sitemaps": sitemaps_lastmod_mixed_descending},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod-sitemaps/ascending.xml",
        views.sitemap,
        {"sitemaps": sitemaps_lastmod_ascending},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "lastmod-sitemaps/descending.xml",
        views.sitemap,
        {"sitemaps": sitemaps_lastmod_descending},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "generic/sitemap.xml",
        views.sitemap,
        {"sitemaps": generic_sitemaps},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "generic-lastmod/sitemap.xml",
        views.sitemap,
        {"sitemaps": generic_sitemaps_lastmod},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
    path(
        "cached/index.xml",
        cache_page(1)(views.index),
        {"sitemaps": simple_sitemaps, "sitemap_url_name": "cached_sitemap"},
    ),
    path(
        "cached/sitemap-<section>.xml",
        cache_page(1)(views.sitemap),
        {"sitemaps": simple_sitemaps},
        name="cached_sitemap",
    ),
    path(
        "sitemap-without-entries/sitemap.xml",
        views.sitemap,
        {"sitemaps": {}},
        name="paradoxdjango.contrib.sitemaps.views.sitemap",
    ),
]

urlpatterns += i18n_patterns(
    path("i18n/testmodel/<int:id>/", testmodelview, name="i18n_testmodel"),
)
