from django.db import models
from django.conf import settings

import troggle.core.methods_millenial as  methods_millenial

#
#   This file was created in 2019
#   It's a result of massive frustration with cluttered database of troggle
#   Maximal clarity of code was primary goal (previous code had very little comments)
#   Maximal speed of database rebuild was secondary goal
#

#
#   The following file will tell you what fields and methods are avaliable inside this database
#   be carefull you might miss some! ManyToMany fields can be used from the far end as well
#


#
#  Naming conventions:
#  (Upper/lower convention)
#  Class names are writen Udddd_ddd_dddM - they finish with M for backwards compatibility
#  Fields/methods are written lower_lower_lower
#

class PersonM(models.Model): #instance of this class corresponds to one physical peson
    name = models.CharField(max_length=100) #just name, talk to wookey if you diagree
    surveys_made = models.ManyToManyField('SurveyM', related_name='people_surveyed') #links to survey objects that this person made (made=:survex says so)
    expos_attended = models.ManyToManyField('ExpeditionM', related_name='people_attended') #expos attended by this person (attended=:folk.csv says so)
    logbook_entries_written = models.ManyToManyField('Logbook_entryM', related_name='people_wrote') #links to logbook chuncks created by a person

class CaveM(models.Model): #instance of this class corresponds to one 'thing' that people call cave
    entrance = models.CharField(max_length=100) #UTM string describing ONE(!) entrance. Purpose = findability
    title = models.TextField() #title given to the topmost survey in survex, numeric name otherwise c.f. name (e.g. 'Fishface')
    name = models.TextField() #name given to the topmost survey in survex (e.g. '2017-cucc-28')
    surveys = models.ManyToManyField('SurveyM', related_name='cave_parent') #links to surveys objects that this cave contains
    survex_file = models.TextField() #gives path to top level survex file
    total_length = models.FloatField() #holds total length of this cave (as given by cavern)
    total_depth = models.FloatField() #holds total depth of this cave (as given by cavern)
    description = models.TextField() #holds link to description
    date = models.TextField() #holds date of last visit
    def top_camp_distance(self): #returns distance of this cave from topcamp
        return methods_millenial.top_camp_distance(self.entrance)
    def top_camp_bearing(self): #returns bearing to this cave from topcamp in format 235.5 (float north-based azimuth)
        return methods_millenial.top_camp_bearing(self.entrance)
    def top_camp_bearing_letter(self): #returns bearing to this cave from topcamp in format e.g. 'NE'
        return methods_millenial.top_camp_bearing_letter(self.entrance)
    def lat_lon_entrance(self): #lat_lon entrance location
        return methods_millenial.lat_lon_entrance(self.entrance)


class Cave_descriptionM(models.Model): #instance of this class corresponds to each of the .html files in descriptions
    #each of those holds one XML field
    slug = models.TextField()
    explorers = models.TextField()
    underground_description = models.TextField()
    equipment = models.TextField()
    references = models.TextField()
    survey = models.TextField()
    kataster_status = models.TextField()
    underground_centre_line = models.TextField()
    survex_file = models.TextField() #as given in .html file
    notes = models.TextField()

    

class ExpeditionM(models.Model): #instance of this class corresponds to one expo (usually one year)
    date = models.CharField(max_length=100) #date in format YYYY.MM.DD-YYYY.MM.DD


class SurveyM(models.Model): #instance of this class corresponds to one .svx file - one trip
    date = models.CharField(max_length=100) #date of the trip in format YYYY.MM.DD (dated:=date given by .svx file) 
    maxdepth = models.FloatField() #represents max depth of a node in this survey

class Logbook_entryM(models.Model): #instance of this class corresponds to one bit of logbook (c.f. expo.survex.com/years/2015/logbook.html or simil)
    date = models.CharField(max_length=100) #date as typed into logbook
    contents = models.TextField() #contents of the logbook chunk

class Parser_messageM(models.Model): #instance of this class contains one error or warining message produce by any of the parsers
    parsername = models.CharField(max_length = 20) #name of parser
    content = models.TextField() #content of message
    message_type = models.CharField(max_length = 10) # [Error,Info] or similar