import datetime
import os.path
import re

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={
    "CAVEDESCRIPTIONS" : settings.CAVEDESCRIPTIONS,
    "DIR_ROOT" : settings.DIR_ROOT,
    "ENTRANCEDESCRIPTIONS" : settings.ENTRANCEDESCRIPTIONS,
    "EXPOUSER_EMAIL" : settings.EXPOUSER_EMAIL,
    "EXPOUSERPASS" :"<redacted>",
    "EXPOUSER" : settings.EXPOUSER,
    "EXPOWEB" : settings.EXPOWEB,
    "EXPOWEB_URL" : settings.EXPOWEB_URL,
    "FILES" : settings.FILES,
    "JSLIB_URL" : settings.JSLIB_URL,
    "LOGFILE" : settings.LOGFILE,
    "LOGIN_REDIRECT_URL" : settings.LOGIN_REDIRECT_URL,
    "MEDIA_ROOT" : settings.MEDIA_ROOT,
    "MEDIA_URL" : settings.MEDIA_URL,
    "PHOTOS_URL" : settings.PHOTOS_URL,
    "PYTHON_PATH" : settings.PYTHON_PATH,
    "REPOS_ROOT_PATH" : settings.REPOS_ROOT_PATH,
    "ROOT_URLCONF" : settings.ROOT_URLCONF,
    "STATIC_URL" : settings.STATIC_URL,
    "SURVEX_DATA" : settings.SURVEX_DATA,
    "SURVEY_SCANS" : settings.SURVEY_SCANS,
    "SURVEYS" : settings.SURVEYS,
    "SURVEYS_URL" : settings.SURVEYS_URL,
    "SVX_URL" : settings.SVX_URL,
    "THREEDCACHEDIR" : settings.THREEDCACHEDIR,
    "TUNNEL_DATA" : settings.TUNNEL_DATA,
    "URL_ROOT" : settings.URL_ROOT
    }
    # settings are unique by paths are not
    ncodes = len(pathsdict)
    bycodeslist = sorted(pathsdict.items())
    
    # create a temporary list
    bypathslist = []
    # iterate through the dictionary and append each tuple into the temporary list 
    for key, value in pathsdict.items():
        tmptuple = (key, value)
        bypathslist.append(tmptuple)
    # bypathslist = sorted(bypathslist)

    return render(request, 'pathsreport.html', { 
        "pathsdict":pathsdict, 
        "bycodeslist":bycodeslist, 
        "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())
    try:
        blockroots = SurvexBlock.objects.filter(name="rootblock")
        if len(blockroots)>1:
            print(" ! more than one root survexblock {}".format(len(blockroots)))
            for sbr in blockroots:
                    print("{} {} {} {}".format(sbr.id, sbr.name, sbr.legsall, sbr.date))
        sbr = blockroots[0]
        totalsurvexlength = sbr.totalleglength
        nimportlegs = sbr.legsall
    except:
        # if no files yet imported into database
        #survexfile = models_survex.SurvexFile(path=settings.SURVEX_TOPNAME, cave=None)
        #survexblockdummy = models_survex.SurvexBlock(name="dummy", survexpath="", cave=None, survexfile=survexfile, 
        #legsall=0, legssplay=0, legssurfc=0, totalleglength=0.0)
        #sbr = survexblockdummy
        totalsurvexlength = 0.0
        nimportlegs = -1
        print("{} {} {} {}".format(sbr.id, sbr.name, sbr.legsall, sbr.date))

    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.totalleglength
            try:
                legsyear += int(survexblock.legsall)
            except:
                pass
        addupsurvexlength += survexleglength
        legsbyexpo.append((expedition, {"nsurvexlegs": "{:,}".format(legsyear), 
                "survexleglength":"{:,.0f}".format(survexleglength)}))
    legsbyexpo.reverse() 

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