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

from troggle.core import views_other, views_caves, views_logbooks, views_statistics, views_survex, view_surveys
from troggle.core.views_other import logbook_entry_suggestions
from troggle.core.views_caves import ent, prospecting_image
from troggle.core.views_statistics import pathsreport, stats
from flatpages import views as flatviews

admin.autodiscover()

#    HOW DOES THIS WORK:
#    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.

actualurlpatterns = [
    url(r'^troggle$',    views_other.frontpage,      name="frontpage"),
    url(r'^caves$',      views_caves.caveindex,      name="caveindex"),
    url(r'^indxal.htm$', views_caves.caveindex,      name="caveindex"),
    url(r'^people/?$',   views_logbooks.personindex, name="personindex"),

    url(r'^newqmnumber/?$',              views_other.ajax_QM_number, ),
    url(r'^lbo_suggestions/?$',              logbook_entry_suggestions),   #broken 
#   url(r'^person/(?P<person_id>\d*)/?$', views_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\-&;]*)/?', views_logbooks.person, name="person"),
#   url(r'^person/(\w+_\w+)$',       views_logbooks.person,      name="person"),
#   url(r'^personform/(.*)$', personForm),

    url(r'^expedition/(\d+)$',  views_logbooks.expedition,  name="expedition"),
    url(r'^expeditions/?$',     views_logbooks.ExpeditionListView.as_view(), name="expeditions"),
    url(r'^personexpedition/(?P<first_name>[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P<last_name>[A-Z]*[a-zA-Z&;]*)/(?P<year>\d+)/?$', views_logbooks.personexpedition, name="personexpedition"),
    url(r'^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$', views_logbooks.logbookentry,name="logbookentry"),
    url(r'^newlogbookentry/(?P<expeditionyear>.*)$', views_logbooks.newLogbookEntry,     name="newLogBookEntry"),
    url(r'^editlogbookentry/(?P<expeditionyear>[^/]*)/(?P<pdate>[^/]*)/(?P<pslug>[^/]*)/$', views_logbooks.newLogbookEntry,     name="editLogBookEntry"), # working !
    url(r'^deletelogbookentry/(?P<expeditionyear>[^/]*)/(?P<date>[^/]*)/(?P<slug>[^/]*)/$', views_logbooks.deleteLogbookEntry, name="deleteLogBookEntry"),
    url(r'^newfile', views_other.newFile, name="newFile"), # oddly broken, needs investigating more

    url(r'^getEntrances/(?P<caveslug>.*)', views_caves.get_entrances, name = "get_entrances"), #works
        # e.g. /getEntrances/1623-161
    url(r'^getQMs/(?P<caveslug>.*)', views_caves.get_qms, name = "get_qms"), # no template "get_qms"?
    url(r'^getPeople/(?P<expeditionslug>.*)', views_logbooks.get_people, name = "get_people"), # fails
    url(r'^getLogBookEntries/(?P<expeditionslug>.*)', views_logbooks.get_logbook_entries, name = "get_logbook_entries"), #works

    url(r'^cave/new/$', views_caves.edit_cave, name="newcave"),
    url(r'^cave/(?P<cave_id>[^/]+)/?$', views_caves.cave, name="cave"),
    url(r'^cave/(?P<cave_id>[^/]+)/?(?P<ent_letter>[^/])$', ent), # how can this work?
    url(r'^cave/(?P<slug>[^/]+)/edit/$', views_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]?)?$', views_caves.qm, name="qm"),

    url(r'^caveslug/([^/]+)/?$', views_caves.caveSlug, name="caveSlug"),
    url(r'^cave/entrance/([^/]+)/?$', views_caves.caveEntrance),
    url(r'^cave/description/([^/]+)/?$', views_caves.caveDescription),
    url(r'^cave/qms/([^/]+)/?$', views_caves.caveQMs), # blank page
    url(r'^cave/logbook/([^/]+)/?$', views_caves.caveLogbook),
    url(r'^cave/3d/(?P<cave_id>[^/]+).3d$', views_caves.cave3d, name="cave3d"),

    url(r'^entrance/(?P<caveslug>[^/]+)/(?P<slug>[^/]+)/edit/', views_caves.editEntrance, name = "editentrance"),
    url(r'^entrance/new/(?P<caveslug>[^/]+)/', views_caves.editEntrance, name = "newentrance"),
    #url(r'^cavedescription/(?P<cavedescription_name>[^/]+)/?$', views_caves.cave_description, name="cavedescription"),
    #url(r'^cavedescription/?$', object_list, {'queryset':CaveDescription.objects.all(),'template_name':'object_list.html'}, name="cavedescriptions"),
    #url(r'^cavehref/(.+)$',     views_caves.cave,       name="cave"),url(r'cave'),
    #url(r'^cavesearch', caveSearch),
    
    url(r'^prospecting_guide/$', views_caves.prospecting),    
    url(r'^logbooksearch/(.*)/?$', views_logbooks.logbookSearch),

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

    url(r'^controlpanel/?$', views_other.controlPanel, name="controlpanel"),
    url(r'^logbook(?P<year>\d\d\d\d)\.(?P<extension>.*)/?$',views_other.downloadLogbook),
    url(r'^logbook/?$',views_other.downloadLogbook, name="downloadlogbook"),
    url(r'^cave/(?P<cave_id>[^/]+)/qm\.csv/?$', views_other.downloadQMs, name="downloadqms"),        
    url(r'^downloadqms$', views_other.downloadQMs),

    url(r'^admin/doc/?', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
    url(r'^admin/', admin.site.urls),
    url(r'^accounts/', include('registration.backends.default.urls')), # needed to log in!
#   url(r'^profiles/', include('profiles.urls')), # not used ? Delete this entire app then.

    url(r'^survexblock/(.+)$',                     views_caves.survexblock, name="survexblock"),
    url(r'^survexfile/(?P<survex_file>.*?)\.svx$', views_survex.svx,        name="svx"),
    url(r'^survexfile/(?P<survex_file>.*?)\.3d$',  views_survex.threed,     name="threed"),
    url(r'^survexfile/(?P<survex_file>.*?)\.log$', views_survex.svxraw),
    url(r'^survexfile/(?P<survex_file>.*?)\.err$', views_survex.err),

    url(r'^survexfile/caves/$',                       views_survex.survexcaveslist,  name="survexcaveslist"),
    url(r'^survexfile/(?P<survex_cave>.*)$',          views_survex.survexcavesingle, name="survexcavessingle"),
    url(r'^survexfileraw/(?P<survex_file>.*?)\.svx$', views_survex.svxraw,           name="svxraw"),

#   url(r'^survey_files/download/(?P<path>.*)$',   view_surveys.download), # needs rewriting

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

    url(r'^tunneldata/$',                            view_surveys.tunneldata,         name="tunneldata"), 
    url(r'^tunneldataraw/(?P<path>.+?\.xml)$',       view_surveys.tunnelfile,         name="tunnelfile"), 
#   url(r'^tunneldatainfo/(?P<path>.+?\.xml)$',      view_surveys.tunnelfileinfo,     name="tunnelfileinfo"), 
    url(r'^tunneldataraw/(?P<path>.+?\.xml)/upload$',view_surveys.tunnelfileupload,   name="tunnelfileupload"), 

    url(r'^prospecting/(?P<name>[^.]+).png$', prospecting_image, name="prospecting_image"),
    
    url(r'^expofiles/(?P<filepath>.*)$',  view_surveys.expofilessingle, name="single"), # EXPOFILES
#   url(r'^javascript/(?P<filepath>.*)$', view_surveys.cssfilessingle,  name="single"), # JSLIB_URL - unused

#   static views not working, removed as a plugin. Use apache instead to serve these:
#   url(r'^photos/(?P<path>.*)$', staticviews.serve,
#            {'document_root': settings.PHOTOS_ROOT, 'show_indexes':True}),
#   url(r'^gallery/(?P<path>.*)$', staticviews.serve,
#            {'document_root': settings.PHOTOS_ROOT, 'show_indexes':True}),
 
#   url(r'^site_media/(?P<filepath>.*)$', view_surveys.cssfilessingle,  name="single"), # MEDIA_ROOT: CSS and JS 
    url(r'^(site_media/.*)$',   flatviews.flatpage, name="flatpage"), # MEDIA_ROOT: CSS and JS 

#   url(r'^static/(?P<filepath>.*)$',     view_surveys.cssfilessingle,  name="single"), # MEDIA_ROOT: CSS and JS
    url(r'^(static/.*)$',       flatviews.flatpage, name="flatpage"), # STATIC: CSS and JS 

    url(r'^(.*)_edit$',         flatviews.editflatpage, name="editflatpage"),
    url(r'^(.*)$',              flatviews.flatpage,     name="flatpage"), # files assumed relative to EXPOWEB
]

#Allow prefix to all urls
urlpatterns = [
    url('^%s' % settings.DIR_ROOT, include(actualurlpatterns))
]