from django.contrib import admin
from django.contrib import messages
from reversion.admin import VersionAdmin
from django.utils.safestring import mark_safe
from django.utils.html import escape

from .models import Prednaska, Seznam, Znalost
from soustredeni.models import Soustredeni


class Seznam_PrednaskaInline(admin.TabularInline):
	"""
		:py:class:`Inline <django.contrib.admin.TabularInline>` pro :py:class:`prednasky.admin.SeznamAdmin` zobrazující :py:class:`Přednášky <prednasky.models.Prednaska>`
		v adminu :py:class:`Seznamu <prednasky.models.Seznam>`.
	"""
	model = Prednaska.seznamy.through
	extra = 0

	def prednaska__nazev(self, obj):
		return mark_safe(
			u"<a href='/admin/prednasky/prednaska/{}'>{}</a>".format(
				obj.prednaska.id,
				escape(obj.prednaska.nazev)
			)
		)

	def prednaska__popis(self, obj):
		return mark_safe(
			u"<div style='width: 200px'>{}</div>".format(
				escape(obj.prednaska.popis)
			)
		)

	def prednaska__anotace(self, obj):
		return obj.prednaska.anotace

	def prednaska__org(self, obj):
		return obj.prednaska.org

	def prednaska__obor(self, obj):
		return obj.prednaska.obor

	prednaska__nazev.short_description = u'Přednáška'
	prednaska__popis.short_description = u'Popis pro orgy'
	prednaska__anotace.short_description = u'Anotace'
	prednaska__org.short_description = u'Org'
	prednaska__obor.short_description = u'Obor'

	readonly_fields = [
		'prednaska__nazev',
		'prednaska__obor',
		'prednaska__org',
		'prednaska__popis',
		'prednaska__anotace',
	]
	exclude = ['prednaska']

	def has_add_permission(self, req, obj): return False


class Seznam_ZnalostInline(admin.TabularInline):
	"""
		:py:class:`Inline <django.contrib.admin.TabularInline>` pro :py:class:`prednasky.admin.SeznamAdmin` zobrazující :py:class:`Znalosti <prednasky.models.Znalost>`
		v adminu :py:class:`Seznamu <prednasky.models.Seznam>`.
	"""
	model = Znalost.seznamy.through
	extra = 0

	def znalost__nazev(self, obj):
		return mark_safe(
			f"<a href='/admin/prednasky/znalost/{obj.znalost.id}'>{obj.znalost.nazev}</a>"
		)

	def znalost__text(self, obj):
		return mark_safe(
			f"<div style='width: 200px'>{escape(obj.znalost.text)}</div>"
		)

	znalost__nazev.short_description = u'Přednáška'
	znalost__text.short_description = u'Popis pro orgy'

	readonly_fields = [
		'znalost__nazev',
		'znalost__text',
	]
	exclude = ['znalost']

	def has_add_permission(self, req, obj): return False


class SeznamAdmin(VersionAdmin):
	""" Admin pro :py:class:`Seznam <prednasky.models.Seznam>` """
	list_display = ['soustredeni', 'stav']
	inlines = [Seznam_PrednaskaInline, Seznam_ZnalostInline]

admin.site.register(Seznam, SeznamAdmin)


class PrednaskaAdmin(VersionAdmin):
	""" Admin pro :py:class:`Přednášku <prednasky.models.Prednaska>` """
	list_display = ['nazev', 'org', 'obor']
	list_filter = ['org', 'obor']
	search_fields = ['nazev']
	filter_horizontal = ('seznamy', )

	actions = ['move_to_soustredeni']

	def move_to_soustredeni(self, request, queryset):
		""" Přidá dané přednášky do seznamu, o kterém se právě hlasuje """
		sous = Soustredeni.objects.first()
		seznam = Seznam.objects.filter(soustredeni=sous, stav=Seznam.Stav.NAVRH)
		if len(seznam) == 0:
			self.message_user(
				request,
				u"Není definován seznam pro aktuální soustředění, "
				u"nic se neprovedlo",
				messages.ERROR
			)
			return
		seznam = seznam[0]
		for prednaska in queryset:
			prednaska.seznamy.add(seznam)
			prednaska.save()

		self.message_user(
			request,
			u"Vybrané přednášky ({}) přidány jako návrhy na nejbližší "
			u"soustředění".format(len(queryset))
		)

	move_to_soustredeni.short_description = (
		u"Přidat přednášky do návrhu na nejbližší soustředění"
	)


admin.site.register(Prednaska, PrednaskaAdmin)


class ZnalostAdmin(PrednaskaAdmin): # Trochu hack, ať nemusím vypisovat všechno znovu
	"""
		Admin pro :py:class:`Znalost <prednasky.models.Znalost>`
		TODO předělat, aby nedědila z :py:class:`prednasky.admin.PrednaskaAdmin`, ale společné věci byly zvlášť
	"""
	list_display = ("__str__",)
	list_filter = ()

admin.site.register(Znalost, ZnalostAdmin)