from django.conf import settings
from django.conf.urls import url, include
from django.views.generic.base import RedirectView 
from django.views.generic.edit import UpdateView
from django.views.generic.list import ListView
from django.contrib import admin
from django.contrib import auth
from django.urls import reverse, resolve

from troggle.core.views import surveys, logbooks, other, caves, statistics, survex
from troggle.core.views.other import troggle404, frontpage
from troggle.core.views.caves import ent, prospecting_image, cavepage
from troggle.core.views.statistics import pathsreport, stats, dataissues
from troggle.core.views.expo import expofiles_redirect, expofilessingle, expopage, editexpopage, mediapage
from troggle.core.views.survex import survexcaveslist, survexcavesingle, svx
from troggle.core.views.auth import expologin, expologout
"""This sets the actualurlpatterns[] and urlpatterns[] lists which django uses 
to resolve urls - in both directions as these are declarative. 

HOW THIS WORKS
This is a "url dispatcher" - something needed by every web framework.
url( <regular expression that matches the thing in the web browser>,
<reference to python function in 'core' folder>, <optional name>)

Django also provides the reverse function: given an an object, provide the URL
which is vital to writing code for the webapp. So the URL dispatch is declarative.

The API urls return TSV or JSON and are new in July 2020.
"""

#handler404 = 'troggle.core.views.other.troggle404' # can't get this to work. but 404.html is default anyway

# Many of these patterns do not work because troggle spent many years broken and we have
# not yet restored all the functions. Some may have never been fully implemented in
# the first place and what they were intended to provide is obscure.

if settings.EXPOFILESREMOTE:
    expofilesurls = [
        url(r'^(?P<path>.*)$',    expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
    ]
else:
    expofilesurls = [
        url(r'^(?P<filepath>.*)$', expofilessingle, name="single"), # local copy of EXPOFILES
    ]
    
# The URLs provided by include('django.contrib.auth.urls') are:

# accounts/login/ [name='login']
# accounts/logout/ [name='logout']
# accounts/password_change/ [name='password_change']
# accounts/password_change/done/ [name='password_change_done']
# accounts/password_reset/ [name='password_reset']
# accounts/password_reset/done/ [name='password_reset_done']
# accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
# accounts/reset/done/ [name='password_reset_complete']

trogglepatterns = [
    url(r'^expofiles/', include(expofilesurls)), 
    
    url(r'^troggle$',    other.frontpage,      name="frontpage"), # control panel. Shows recent actions.
    url(r'^caves$',      caves.caveindex,      name="caveindex"),
    url(r'^indxal.htm$', caves.caveindex,      name="caveindex"), # ~420 hrefs to this url in expoweb files
    url(r'^people/?$',   logbooks.personindex, name="personindex"),

    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
    url(r'^admin/', admin.site.urls), # includes admin login & logout urls
    
# setting LOGIN_URL = '/accounts/login/' is default
# url ENDS WITH this string
    url(r'logout/$', expologout, name='expologout'), # higher precedence than /accounts/logout
    url(r'login/$',  expologin,  name='expologin'),  # higher precedence than /accounts/login
    #url(r'^accounts/', include('django.contrib.auth.urls')),  # from Dj3.0, see site-packages\registration\auth_urls_classes.py


#   url(r'^person/(?P<person_id>\d*)/?$', logbooks.person),
    url(r'^person/(?P<first_name>[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P<last_name>[a-z\-\']*[^a-zA-Z]*[A-Z]*[a-z\-&;]*)/?', logbooks.person, name="person"),
#   url(r'^person/(\w+_\w+)$',       logbooks.person,      name="person"),

    url(r'^expedition/(\d+)$',  logbooks.expedition,  name="expedition"),
    url(r'^api/expeditions_tsv$', logbooks.Expeditions_tsvListView.as_view()),
    url(r'^api/expeditions_json$', logbooks.Expeditions_jsonListView.as_view()),
    url(r'^personexpedition/(?P<first_name>[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P<last_name>[A-Z]*[a-zA-Z&;]*)/(?P<year>\d+)/?$', logbooks.personexpedition, name="personexpedition"),

#   Logbook entries
    url(r'^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$', logbooks.logbookentry,name="logbookentry"),
    url(r'^getLogBookEntries/(?P<expeditionslug>.*)', logbooks.get_logbook_entries, name = "get_logbook_entries"), #works
    url(r'^newfile', other.newFile, name="newFile"), # oddly broken, needs investigating more
    url(r'^logbooksearch/(.*)/?$', logbooks.logbookSearch),
    url(r'^logbook(?P<year>\d\d\d\d)\.(?P<extension>.*)/?$', other.downloadLogbook),
    url(r'^logbook/?$', other.downloadLogbook, name="downloadlogbook"),


# QMs pages
    url(r'^cave/qms/([^/]+)/?$', caves.caveQMs), # blank page
    url(r'^cave/(?P<cave_id>[^/]+)/qm\.csv/?$', other.downloadQMs, name="downloadqms"),
    url(r'^newqmnumber/?$',              other.ajax_QM_number, ),
    url(r'^getQMs/(?P<caveslug>.*)', caves.get_qms, name = "get_qms"), # no template "get_qms"?
    url(r'^getPeople/(?P<expeditionslug>.*)', logbooks.get_people, name = "get_people"), # fails
    url(r'^downloadqms$', other.downloadQMs),

#   Cave description pages
    url(r'^cave/new/$', caves.edit_cave, name="newcave"),
    url(r'^cave/3d/(?P<cave_id>[^/]+)$', caves.cave3d, name="cave3d"),
    url(r'^cave/(?P<cave_id>[^/]+)/?$', caves.cave, name="cave"),
    url(r'^cave/(?P<cave_id>[^/]+)/?(?P<ent_letter>[^/])$', ent), # view_caves.ent
    url(r'^cave/(?P<slug>[^/]+)/edit/$', caves.edit_cave, name="edit_cave"),
    url(r'^cave/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d*)(?P<grade>[ABCDX]?)?$', caves.qm, name="qm"),

    url(r'^cave/entrance/([^/]+)/?$', caves.caveEntrance),
    url(r'^cave/description/([^/]+)/?$', caves.caveDescription),
    url(r'^cave/logbook/([^/]+)/?$', caves.caveLogbook),
    url(r'^(?P<karea>\d\d\d\d)(?P<subpath>.*)$',     cavepage,     name="cavepage"), # shorthand references such as /1623/264

    url(r'^getEntrances/(?P<caveslug>.*)', caves.get_entrances, name = "get_entrances"), #works e.g. /getEntrances/1623-161 # CASE SENSITIVE
    url(r'^entrance/(?P<caveslug>[^/]+)/(?P<slug>[^/]+)/edit/', caves.editEntrance, name = "editentrance"),
    url(r'^entrance/new/(?P<caveslug>[^/]+)/', caves.editEntrance, name = "newentrance"), # NOT WORKING
    

    url(r'^statistics/?$',  statistics.stats, name="stats"),
    url(r'^stats/?$',       statistics.stats, name="stats"),
    url(r'^pathsreport.*$', statistics.pathsreport, name="pathsreport"),
    url(r'^dataissues/?$',  statistics.dataissues,  name="dataissues"),

    url(r'^controlpanel/?$', other.controlPanel, name="controlpanel"),


    url(r'^prospecting_guide/$', caves.prospecting),    
    url(r'^prospecting/(?P<name>[^.]+).png$', prospecting_image, name="prospecting_image"),

# The survexfile pages
    url(r'^survexfile/(?P<survex_file>.*?)\.svx$', survex.svx,        name="svx"),
    url(r'^survexfile/(?P<survex_file>.*?)\.3d$',  survex.threed,     name="threed"),
    url(r'^survexfile/(?P<survex_file>.*?)\.log$', survex.svxraw),
    url(r'^survexfile/(?P<survex_file>.*?)\.err$', survex.err),

    url(r'^survexfile/caves/$',                       survex.survexcaveslist,     name="survexcaveslist"),
    url(r'^survexfile/caves$',                        survex.survexcaveslist,     name="survexcaveslist"), # auto slash not working
    url(r'^survexfile/(?P<survex_cave>.*)$',          survex.survexcavesingle,    name="survexcavessingle"),

    url(r'^survey_scans/$',                           surveys.surveyscansfolders, name="surveyscansfolders"), 
    url(r'^survey_scans/(?P<path>[^/]+)/$',           surveys.surveyscansfolder,  name="surveyscansfolder"),
    url(r'^survey_scans/(?P<path>[^/]+)/(?P<file>[^/]+)$', 
                                                      surveys.surveyscansingle,   name="surveyscansingle"), 

# The tunnel and therion drawings files pages
    url(r'^tunneldata/$',                             surveys.tunneldata,        name="tunneldata"), 
    url(r'^tunneldataraw/(?P<path>.+?\.xml)$',        surveys.dwgfilesingle,     name="dwgfilesingle"), 
    url(r'^tunneldataraw/(?P<path>.+?\.th)$',         surveys.dwgfilesingle,     name="dwgfilesingle"), 
    url(r'^tunneldataraw/(?P<path>.+?\.th2)$',        surveys.dwgfilesingle,     name="dwgfilesingle"), 
#   url(r'^tunneldatainfo/(?P<path>.+?\.xml)$',       surveys.tunnelfileinfo,    name="tunnelfileinfo"), # parses tunnel for info
    url(r'^tunneldataraw/(?P<path>.+?\.xml)/upload$', surveys.tunnelfileupload,  name="tunnelfileupload"), 
    
# This next set are all intercepted by Apache, if it is running.
    url(r'^photos/(?P<subpath>.*)$',      mediapage, {'doc_root': settings.PHOTOS_ROOT}, name="mediapage"), # photo galleries 
    url(r'^site_media/(?P<subpath>.*)$',  mediapage, {'doc_root': settings.MEDIA_ROOT},  name="mediapage"), # MEDIA_ROOT: CSS and JS 
    url(r'^static/(?P<subpath>.*)$',      mediapage, {'doc_root': settings.MEDIA_ROOT},  name="mediapage"), # STATIC is in MEDIA now!
    url(r'^javascript/(?P<subpath>.*)$',  mediapage, {'doc_root': settings.JSLIB_ROOT},  name="mediapage"), # JSLIB_URL 
    url(r'^expowebcache/3d/(?P<subpath>.*)$',  mediapage, {'doc_root': settings.THREEDCACHEDIR},  name="mediapage"),  

#   url(r'^map/', .........), # Intercepted by Apache. Yields OpenStreetMap. Redirects to expoweb/map

# Final catchall which also serves expoweb handbook pages and images
    url(r'^(.*)_edit$',         editexpopage, name="editexpopage"),
    url(r'^(.*)$',              expopage,     name="expopage"),     # CATCHALL assumed relative to EXPOWEB
]

# do not allow DIR_ROOT prefix to all urls
urlpatterns = [
    # url('^%s' % settings.DIR_ROOT, include(trogglepatterns))
    url('', include(trogglepatterns))
]

# When apache is running these prempt Django so Django never sees them.
# NB apache has its own ideas about mimetypes, so behaviour may not be identical for .xml files by troggle

# NEW apache configurations suggested as of 2 April 2021: 
# Alias /site-media/ /home/expo/troggle/media/
# Alias /robots.txt  /home/expo/troggle/media/robots.txt
# Alias /favicon.ico /home/expo/troggle/media/favicon.ico  # comes from /expoweb/* when running runserver
# Alias /javascript  /home/expo/troggle/media/jslib        # empty

# Copy of old standard apache configurations:
# Alias /expofiles   /home/expo/expofiles
# Alias /photos      /home/expo/webphotos
# Alias /map         /home/expo/expoweb/map
# Alias /javascript  /usr/share/javascript              # to be changed
# Alias /robots.txt  /home/expo/static/robots.txt       # to be changed
# Alias /favicon.ico /home/expo/static/favicon.ico      # to be changed
# Alias /static/     /home/expo/static/

# ScriptAlias /repositories  /home/expo/config/apache/services/hgweb/hgweb.cgi
# ScriptAlias /boe           /home/expo/boe/boc/boc.pl
# ScriptAlias /boe-lastyear  /home/expo/boe/boc-previous/boc.pl