import datetime
import os.path
import re
from collections import OrderedDict

import django.db.models
from django.db.models import Min, Max
from django.shortcuts import render, render_to_response
from django.template import Context, loader
from django.template.defaultfilters import slugify
from django.utils import timezone
#from django.views.generic.list import ListView

from troggle.core.models import Expedition, Person, PersonExpedition
from troggle.core.models_caves import Cave, LogbookEntry
from troggle.core.models_survex import SurvexBlock

import troggle.settings as settings


def pathsreport(request):
    pathsdict = OrderedDict()
    try:
        pathsdict = {
#       "BOGUS" : str( settings.BOGUS),
        "JSLIB_URL" : str( settings.JSLIB_URL),
#       "CSSLIB_URL" : str( settings.CSSLIB_URL),
        "CAVEDESCRIPTIONS" : str( settings.CAVEDESCRIPTIONS),
        "DIR_ROOT" : str( settings.DIR_ROOT),
        "ENTRANCEDESCRIPTIONS" : str( settings.ENTRANCEDESCRIPTIONS),
        "EXPOUSER_EMAIL" : str( settings.EXPOUSER_EMAIL),
        "EXPOUSERPASS" : str("<redacted>"),
        "EXPOUSER" : str( settings.EXPOUSER),
        "EXPOWEB" : str( settings.EXPOWEB),
        "EXPOWEB_URL" : str( settings.EXPOWEB_URL),
        "FILES" : str( settings.FILES),
        "LOGFILE" : str( settings.LOGFILE),
        "LOGIN_REDIRECT_URL" : str( settings.LOGIN_REDIRECT_URL),
        "MEDIA_ROOT" : str( settings.MEDIA_ROOT),
        "MEDIA_URL" : str( settings.MEDIA_URL),
        "PHOTOS_URL" : str( settings.PHOTOS_URL),
        "PYTHON_PATH" : str( settings.PYTHON_PATH),
        "REPOS_ROOT_PATH" : str( settings.REPOS_ROOT_PATH),
        "ROOT_URLCONF" : str( settings.ROOT_URLCONF),
        "STATIC_URL" : str( settings.STATIC_URL),
        "SURVEX_DATA" : str( settings.SURVEX_DATA),
        "SURVEY_SCANS" : str( settings.SURVEY_SCANS),
        "SURVEYS" : str( settings.SURVEYS),
        "SURVEYS_URL" : str( settings.SURVEYS_URL),
        "SURVEXPORT" : str( settings.SURVEXPORT),
        "THREEDCACHEDIR" : str( settings.THREEDCACHEDIR),
        "TUNNEL_DATA" : str( settings.TUNNEL_DATA),
        "URL_ROOT" : str( settings.URL_ROOT)
        }
    except:
        pathsdict["! EXCEPTION !"] = "missing or exta string constant in troggle/settings"

    pathstype = OrderedDict()
    try:
        pathstype = {
#       "BOGUS" : type(settings.BOGUS),
        "JSLIB_URL" : type(settings.JSLIB_URL),
#       "CSSLIB_URL" : type(settings.CSSLIB_URL),
        "CAVEDESCRIPTIONS" : type(settings.CAVEDESCRIPTIONS),
        "DIR_ROOT" : type(settings.DIR_ROOT),
        "ENTRANCEDESCRIPTIONS" : type(settings.ENTRANCEDESCRIPTIONS),
        "EXPOUSER_EMAIL" : type(settings.EXPOUSER_EMAIL),
        "EXPOUSERPASS" : type(settings.EXPOUSERPASS),
        "EXPOUSER" : type(settings.EXPOUSER),
        "EXPOWEB" : type(settings.EXPOWEB),
        "EXPOWEB_URL" : type(settings.EXPOWEB_URL),
        "FILES" : type(settings.FILES),
        "LOGFILE" : type(settings.LOGFILE),
        "LOGIN_REDIRECT_URL" : type(settings.LOGIN_REDIRECT_URL),
        "MEDIA_ROOT" : type(settings.MEDIA_ROOT),
        "MEDIA_URL" : type(settings.MEDIA_URL),
        "PHOTOS_URL" : type(settings.PHOTOS_URL),
        "PYTHON_PATH" : type(settings.PYTHON_PATH),
        "REPOS_ROOT_PATH" : type(settings.REPOS_ROOT_PATH),
        "ROOT_URLCONF" : type(settings.ROOT_URLCONF),
        "STATIC_URL" : type(settings.STATIC_URL),
        "SURVEX_DATA" : type(settings.SURVEX_DATA),
        "SURVEY_SCANS" : type(settings.SURVEY_SCANS),
        "SURVEYS" : type(settings.SURVEYS),
        "SURVEYS_URL" : type(settings.SURVEYS_URL),
        "SURVEXPORT" : type(settings.SURVEXPORT),
        "THREEDCACHEDIR" : type(settings.THREEDCACHEDIR),
        "TUNNEL_DATA" : type(settings.TUNNEL_DATA),
        "URL_ROOT" : type(settings.URL_ROOT)
        }
    except:
        pathstype["! EXCEPTION !"] = "missing or exta string constant in troggle/settings"

    # settings are unique by paths are not
    ncodes = len(pathsdict)
    bycodeslist = sorted(pathsdict.items()) # a list of tuples
    bycodeslist2 = []

    for k, p in bycodeslist:
        bycodeslist2.append((k, p, str(pathstype[k])))
    
    bypaths = sorted(pathsdict.values()) # a list 
    bypathslist = []
    
    for p in bypaths:
        for k in pathsdict.keys():
            if pathsdict[k] == p:
                bypathslist.append((p, k, str(pathstype[k])))
                del pathsdict[k]
                break

    return render(request, 'pathsreport.html', { 
        "pathsdict":pathsdict, 
        "bycodeslist":bycodeslist2, 
        "bypathslist":bypathslist, 
        "ncodes":ncodes})

def stats(request):
    statsDict={}
    statsDict['expoCount'] = "{:,}".format(Expedition.objects.count())
    statsDict['caveCount'] = "{:,}".format(Cave.objects.count())
    statsDict['personCount'] = "{:,}".format(Person.objects.count())
    statsDict['logbookEntryCount'] = "{:,}".format(LogbookEntry.objects.count())

    legsbyexpo = [ ]
    addupsurvexlength = 0
    for expedition in Expedition.objects.all():
        survexblocks = expedition.survexblock_set.all()
        legsyear=0
        survexleglength = 0.0
        for survexblock in survexblocks:
            survexleglength += survexblock.legslength
            try:
                legsyear += int(survexblock.legsall)
            except:
                pass
        addupsurvexlength += survexleglength
        legsbyexpo.append((expedition, {"nsurvexlegs": "{:,}".format(legsyear), 
                "survexleglength":"{:,.0f}".format(survexleglength)}))
    legsbyexpo.reverse() 

    renderDict = {**statsDict, **{ "addupsurvexlength":addupsurvexlength/1000, "legsbyexpo":legsbyexpo }} # new syntax
    return render(request,'statistics.html',  renderDict)