from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.newforms import *
from django.template import RequestContext, Context
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from ghestalt.app.models import Log, UserProfile
from ghestalt.app.utils import bad_or_missing
from ghestalt.app.log_what import wikiwhat
from ghestalt.i18n.utils import *
from ghestalt.app.showthm import render_thm

# Map "what" to title
titleprefs = {'wiki': 'Wiki: ', 'bib': 'Bibliography: ', 'user': 'User: '}
def wikititle(title):
    ltitle = title.split('/')
    prefix = suffix = ''
    if len(ltitle) > 1 and titleprefs.has_key(ltitle[0]):
	prefix = _(titleprefs[ltitle[0]])
	del ltitle[0]
    if len(ltitle) > 1 and ltitle[-1] == 'talk':
	suffix = _(' discussion')
	del ltitle[-1]
    ltitle[-1] = i18n_baselang(ltitle[-1])
    return prefix + '/'.join(ltitle) + suffix

def wiki_homepage(request):
    return HttpResponseRedirect(i18n_site_base(request)+'/wiki/HomePage'+i18n_wiki_suffix(request))

def wiki_showpage(request, page, origwhat=None):
    what = wikiwhat(page)
    try:
        log = Log.objects.filter(what=what).latest()
    except:
        if i18n_baselang(what) != what:
            return wiki_showpage(request,i18n_baselang(page),origwhat=what)
        if origwhat:
            what = origwhat
        return render_to_response('missing.html',{'title':wikititle(what), 'what':what},
                                  RequestContext(request))
    if i18n_lang_suffix(what)[1:] in settings.LANGUAGES_BIDI:
        content_bidi = True
    else:
        content_bidi = False
    all_langs = map(lambda x: x['what'],Log.objects.filter(what__startswith=i18n_baselang(what)).values('what').distinct())
    all_langs = filter(lambda x: x.rsplit('_',1)[0]==i18n_baselang(what),all_langs)
    all_langs.sort()
    trans_target = None
    trans_source = what
    if i18n_baselang(what) not in all_langs:
        trans_target = i18n_baselang(what)
    try:
        if i18n_baselang(what)+'_'+request.session['otro_lang'] not in all_langs:
            trans_target = i18n_baselang(what)+'_'+request.session['otro_lang']
    except KeyError:
        pass
    if origwhat:
        trans_target = origwhat
        what = origwhat
    return render_to_response('wiki.html',{'title':wikititle(page), 'log':log, 'origwhat':origwhat, 'what':what, 'all_langs':all_langs, 'trans_target':trans_target, 'trans_source':trans_source, 'no_title':log.ldata.startswith('=='),'CONTENT_BIDI': content_bidi},
                              RequestContext(request))

def wiki_showid(request, idnum):
    try:
        log = Log.objects.get(id=idnum)
    except Log.DoesNotExist:
        return HttpResponse('Page does not exist')
    return render_to_response('wiki.html',{'title':wikititle(log.what), 'log':log, 'what':log.what},
                              RequestContext(request))

def wiki_index(request):
    log = Log.objects.filter(what__startswith='wiki/').distinct().values('what')
    return render_to_response('index.html',{'log':log},
                              RequestContext(request))

def wiki_showhistory(request,page):
    what = wikiwhat(page)
    log = Log.objects.filter(what=what).order_by('-id')[:5]
    return render_to_response('history.html',{'title':wikititle(what),'log':log},
                              RequestContext(request))

def wiki_recent(request):
    log = Log.objects.all().order_by('-id')[:50]
    return render_to_response('recent.html',{'log':log},
                              RequestContext(request))

class NewPageForm(Form):
    page_name = CharField(label=_('Page name'),max_length=30,required=False)
    language = ChoiceField(label=_('Language'),choices=settings.LANGUAGES)
    def clean(self):
        return self.clean_data
    
def wiki_new(request):
    if request.POST:
        form = NewPageForm(request.POST)
        if form.is_valid():
            page_name = form.clean_data.get('page_name')
            language = form.clean_data.get('language')
            if language!=settings.LANGUAGE_CODE[:2]:
                suffix = '_'+language
            else:
                suffix = ''
            return HttpResponseRedirect(i18n_site_base(request)+'/edit/wiki/'+page_name+suffix)
    else:
        form = NewPageForm({'language':request.LANGUAGE_CODE[:2]})
    return render_to_response('newpage.html',{'form':form},
                              RequestContext(request))

def wiki_roster(request):
    userlist = UserProfile.objects.all().order_by('create_date')[:50]
    return render_to_response('roster.html',{'userlist':userlist},
                              RequestContext(request))

class LogForm(Form):
    ldata = CharField(widget=Textarea(attrs={'rows': 24, 'cols': 80}), label=_("Text"))
    def clean(self):
        return self.clean_data

def wiki_editpage(request, page):
    what = wikiwhat(page)
    if request.POST:
        form = LogForm(request.POST)
        if form.is_valid():
            try:
                user = User.objects.get(id=request.user.id)
            except:
                return bad_or_missing(request, 'Seems you are not logged in properly. Perhaps, you should re-login.')
            if '_preview' in request.POST:
                if i18n_lang_suffix(what)[1:] in settings.LANGUAGES_BIDI:
                    content_bidi = True
                else:
                    content_bidi = False
                return render_to_response('edit.html',{'form': form, 'title':wikititle(what), 'mtime':'now', 'muser':'me', 'preview': form.clean_data.get('ldata'), 'what':what,'CONTENT_BIDI': content_bidi },
                              RequestContext(request))
            log = Log(what=what, ldata=form.clean_data.get('ldata').encode('utf-8'), muser=user.username)
            log.save()
            return HttpResponseRedirect(i18n_site_base(request)+'/' + what)
    else:
        if request.GET.has_key('source'):
            source = request.GET['source']
            add_prefixes = True
        else:
            source = what
            add_prefixes = False
        try:
            log = Log.objects.filter(what=source).latest()
            trans_message = '\n^^^^^ '+_('Replace caret marked lines with translation')+'\n^ '
            if add_prefixes:
                form = LogForm({'ldata':trans_message+log.ldata.replace('\n','\n^ ')+trans_message+'\n'})
            else:
                form = LogForm({'ldata':log.ldata})
        except:
            form = LogForm()
    return render_to_response('edit.html',{'form': form, 'title':wikititle(what), 'mtime':'now', 'muser':'me', 'what':what},
                              RequestContext(request))

wiki_editpage = login_required(wiki_editpage)

def show_theorem(request, theorem, origwhat=None):
    what = theorem
    try:
        norm = Log.objects.filter(what=what + '/_norm').latest()
    except Log.DoesNotExist:
	norm = {'what': what + '/_norm'}
    try:
        thm = Log.objects.filter(what=what + '/_thm').latest()
        render_dict = render_thm(what, norm, thm)
    except Log.DoesNotExist:
	try:
	    stmt = Log.objects.filter(what=what + '/_stmt').latest()
	    render_dict = {'title': wikititle(what),
			   'norm': norm,
			   'thm': stmt}
	except Log.DoesNotExist:
            if i18n_baselang(what) != what:
                return show_theorem(request,i18n_baselang(theorem),origwhat=what)
	    return render_to_response('missing.html',{'title':wikititle(what), 'what':what},
                                  RequestContext(request))
    if origwhat:
        what = origwhat
    render_dict['what'] = what
    render_dict['origwhat'] = origwhat
    return render_to_response('theorem.html',
			      render_dict,
			      RequestContext(request))
def recent_actions(request):
    user = User.objects.get(id=request.user.id)
    log = Log.objects.filter(muser=user.username).order_by('-id')[:5]
    return render_to_response('recent_activity.html',{'theuser':user.username,'log':log},
                              RequestContext(request))

recent_actions = login_required(recent_actions)
