from django.db import models
from django.urls import reverse
from home.models import Title_full, Country, Room, Gender, Status, Status_extern, Prenominal
#from research.models import Thesis
from phonenumber_field.modelfields import PhoneNumberField
from external.models import News, Presentation
#from research.models import Project
# from research.models import ResearchEquipment
from django.template.defaultfilters import slugify

from django.conf import settings
from django.core.files.storage import FileSystemStorage
import os

import datetime

class OverwriteStorage(FileSystemStorage):
    '''
    Muda o comportamento padrão do Django e o faz sobrescrever arquivos de
    mesmo nome que foram carregados pelo usuário ao invés de renomeá-los.
    '''
    def get_available_name(self, name, max_length=None):
        if self.exists(name):
            os.remove(os.path.join(self.location, name))
        return name


class CV(models.Model):
    tex_file = models.FileField(upload_to='uploads/cv_files/', blank=True, storage=OverwriteStorage())
    pdf_file = models.FileField(upload_to='uploads/cv_files/', blank=True)
    pdf_short = models.FileField(upload_to='uploads/cv_files/', blank=True)
    log_file = models.FileField(upload_to='uploads/cv_files/', blank=True)
    
    publication_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    conferences_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    patents_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    papers_selected_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    phds_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    talks_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    rest_include = models.FileField(upload_to='uploads/cv_files/auto_include', blank=True, storage=OverwriteStorage())
    
    # def remove_on_file_update(self): # the old file needs to be deleted or saved as old?
    #     try:
    #         obj = CV.objects.get(id=self.id)
    #     except CV.DoesNotExist:
    #             # object is not in db, nothing to worry about
    #         return
    #         # is the save due to an update of the actual image file?
    #     if  self.publication_include is None:
    #         obj.publication_include.delete()
    #     if obj.publication_include and self.publication_include and obj.publication_include != self.publication_include:
    #             # delete the old image file from the storage in favor of the new file
    #         obj.publication_include.delete()
    #
    # def save(self, *args, **kwargs):
    #     # object is possibly being updated, if so, clean up.
    #     self.remove_on_file_update()
    #     return super(CV, self).save(*args, **kwargs)

class Halslide(models.Model):
    name = models.CharField('Unique Name', max_length=100, unique=True)
    slide = models.FileField(upload_to='uploads/internal/slides/', help_text='Image format: png; Video format: mp4')
    slide_editable = models.FileField('Editable file',upload_to='uploads/internal/slides/', help_text='Here you should upload the editable file.',blank=True,null=True)
    time = models.IntegerField(default=10,help_text='Display time of the slide in seconds. If the slide has video format the display time will be adjusted to video length automatically.')
    show = models.BooleanField(default=True, help_text='Show on webpage')
    date = models.DateField("Date added", default=datetime.date.today)
    def __str__(self):
        return self.name
    
    def get_extension(self):
        name, extension = os.path.splitext(self.slide.name)
        return extension.lower()
    
    def get_absolute_url(self):
        """Returns the url to access a detail record for this publication."""
        return '/halway'
    
    class Meta:
        ordering = ['-show','-date']


class Researchslide(models.Model):
    name = models.CharField('Unique Name', max_length=100, unique=True)
    slide = models.FileField(upload_to='uploads/internal/slides/', help_text='Image format: png; Video format: mp4')
    slide_editable = models.FileField('Editable file',upload_to='uploads/internal/slides/', help_text='Here you should upload the editable file.',blank=True,null=True)
    time = models.IntegerField(default=10,help_text='Display time of the slide in seconds. If the slide has video format the display time will be adjusted to video length automatically.')
    show = models.BooleanField(default=True, help_text='Show on webpage')
    date = models.DateField("Date added", default=datetime.date.today)
    def __str__(self):
        return self.name
    
    def get_extension(self):
        name, extension = os.path.splitext(self.slide.name)
        return extension.lower()
    
    def get_absolute_url(self):
        """Returns the url to access a detail record for this publication."""
        return '/resslides'
    
    class Meta:
        ordering = ['-show','-date']

class Teachingslide(models.Model):
    name = models.CharField('Unique Name', max_length=100, unique=True)
    slide = models.FileField(upload_to='uploads/internal/slides/', help_text='Image format: png; Video format: mp4')
    slide_editable = models.FileField('Editable file',upload_to='uploads/internal/slides/', help_text='Here you should upload the editable file.',blank=True,null=True)
    time = models.IntegerField(default=10,help_text='Display time of the slide in seconds. If the slide has video format the display time will be adjusted to video length automatically.')
    show = models.BooleanField(default=True, help_text='Show on webpage')
    date = models.DateField("Date added", default=datetime.date.today)
    def __str__(self):
        return self.name
    
    def get_extension(self):
        name, extension = os.path.splitext(self.slide.name)
        return extension.lower()
    
    def get_absolute_url(self):
        """Returns the url to access a detail record for this publication."""
        return '/tsslides'
    
    class Meta:
        ordering = ['-show','-date']
    

class Device(models.Model):
    inventory_number = models.CharField('Inventory_number', max_length=50, default=None, null=True, blank=True, unique=True)
    serial_number = models.CharField( max_length=50, default=None, null=True, blank=True, unique=True)
    name = models.CharField('Name', max_length=50)
    year = models.IntegerField(null=True, blank=True)
    description =  models.TextField(max_length=5000, default=None, null=True, blank=True)
    history =  models.TextField(max_length=5000, default=None, null=True, blank=True)
    price = models.IntegerField('Price', default=None, null=True, blank=True)
    # active = models.BooleanField(default=True, help_text='Still usable?')
    defect = models.BooleanField(default=False )
    usage = models.BooleanField(default=True,verbose_name='In use')
    member = models.ForeignKey('Member', default=None, on_delete=models.SET_DEFAULT,null=True, blank=True)
    room = models.ForeignKey(Room, default=None, null=True, blank=True, on_delete=models.SET_DEFAULT)
    chair_task=models.CharField(verbose_name='Usage for chair related tasks', max_length=50,help_text='i.e. presenter laptop',null=True,blank=True)
    research_eq = models.ManyToManyField("research.ResearchEquipment", through="research.ResearchEquipment_device", related_name="device_research_eq",blank=True,verbose_name='Research equipment',help_text='Used with which IT-devices?')
    
    def __str__(self):
        if self.inventory_number and self.serial_number:
            return self.name + ' / Inv-nr.: ' + self.inventory_number + ' / S-nr.: ' + self.serial_number
        elif self.inventory_number and not self.serial_number:
            return self.name + ' / Inv-nr.: ' + self.inventory_number
        elif not self.inventory_number and self.serial_number:
            return self.name + ' / S-nr.: ' + self.serial_number
        elif not self.inventory_number and not self.serial_number:
            return self.name
        

class GroupTopic(models.Model):
    """ class needed to allow multiple file upload in class Group"""
    group = models.ForeignKey("Group", default=None, on_delete=models.CASCADE)
    image = models.FileField(upload_to = 'uploads/group_images/',blank=True)
    title = models.CharField(max_length=200, default=None, null=True, blank=True)
    description = models.TextField(max_length=5000, default=None, null=True, blank=True)
    copyright = models.CharField( max_length=50, default=None, null=True, blank=True)
    def __str__(self):
        return self.group.name


class Postnominal(models.Model):
    member = models.ForeignKey("Member", default=None, on_delete=models.CASCADE)
    letters = models.CharField(max_length=20,blank=True,default=None, null=True,help_text="Enter the post-nominal here")
    url = models.URLField(blank=True,null=True, default=None)
    def __str__(self):
        if self.member.title is not None:
            return f'{self.member.title.title_short} {self.member.given_name} {self.member.last_name}'
        else:
            return f'{self.member.given_name} {self.member.last_name}'

def create_slug_member(name, last_name):
    slug = slugify(name+'_' + last_name)
    qs = Member.objects.filter(slug=slug)
    exists = qs.exists()
    if exists:
        # slug = "%s-%s" %(slug, qs.first().id)
        slug = slug + str(qs.first().id)
    return slug


class Member_tac(models.Model):
    member = models.ForeignKey("Member", default=None, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, default=None, null=True, blank=True)
    # date = models.DateTimeField('TAC meeting',default=None, blank=True,null=True)
    date_new=models.DateField('Date',default=None, blank=True,null=True)
    slides = models.FileField(upload_to='uploads/members/tac/',blank=True,null=True)
    document = models.FileField('Document 1',upload_to='uploads/members/tac/',blank=True,null=True)
    document_2 = models.FileField('Document 2',upload_to='uploads/members/tac/',blank=True,null=True)
    document_3 = models.FileField('Document 3',upload_to='uploads/members/tac/',blank=True,null=True)
    def __str__(self):
        return str(self.date_new)
    class Meta:
        verbose_name='TAC meeting'


class Member(models.Model):
    """Model representing a single member entry."""
    given_name = models.CharField('Given Name', max_length=50)
    given_name_alt = models.CharField('Alternative given name', max_length=50,
            help_text='Name with ä,ü,ö... or ` usw.', null=True, default=None, blank=True)
    last_name = models.CharField('Last Name',max_length=50)
    last_name_alt = models.CharField('Alternative last name', max_length=50,
            help_text='Name with ä,ü,ö... or ` usw.', null=True, default=None, blank=True)
    sort_status = models.CharField( max_length=20,blank=True,default=None, null=True)
    organisation_extern = models.CharField('External organisation', max_length=50,null=True, blank =True)
    url_label_extern = models.CharField('Shown label instead of external URL', max_length=50,null=True, blank =True,help_text="")

    bio = models.TextField('Biographie', max_length=10000, blank=True, null=True)

    job_mail = models.EmailField('Job Email', default=None, blank=True, null=True, help_text='For example: forename.lastname@tu-dresden.de')
    job_phone = PhoneNumberField(null=True, blank = True)

    active = models.BooleanField(default=True, help_text='Active Member? If it is deactivated the Member will pass to Alumni.')
    visitor = models.BooleanField(default=False)
    extern_related=models.BooleanField(default=False,help_text='Only TRUE if this member was and is not at chair; Used for references from different classes i.e. Patent inventor')
    show_public = models.BooleanField(default=True,verbose_name='Show on webpage?',help_text='Independent of "active", "visitor" or "extern related"')
    meta_tags = models.BooleanField(default=True,verbose_name='Set meta tags for Google, Twitter, Facebook?',help_text='Activate/Deactivate meta tags')

    birth_day = models.DateField('Birthday', default=None, null=True, blank=True)
    entry_date =  models.DateField('Entry Date', default=None, null=True, blank=True)
    exit_date = models.DateField('Exit Date', default=None, null=True, blank=True)
    
    image = models.ImageField(upload_to='uploads/members/img/', null=True, blank=True,verbose_name='Photo (ratio: 4:3)',help_text='Please use height-width-ratio of 4:3')

    tud_fis=models.URLField('FIS (TUD)', max_length = 200,default=None, null=True, blank=True)
    linkedin = models.URLField('Linkedin',max_length = 200, default=None, null=True, blank=True)
    xing = models.URLField('Xing',max_length = 200, default=None, null=True, blank=True)
    orcid = models.URLField('ORCID',max_length = 200,default=None, null=True, blank=True)
    researchgate = models.URLField('Researchgate', max_length = 200, default=None, null=True, blank=True)
    researcher_id = models.URLField('publons', max_length = 200,default=None, null=True, blank=True)
    research = models.URLField('Research.com', max_length = 200,default=None, null=True, blank=True)
    googlescholar = models.URLField('Google Scholar', max_length = 200,default=None, null=True, blank=True)
    scopus = models.URLField('Scopus', max_length = 200,default=None, null=True, blank=True)
    adscientificindex = models.URLField('Ad scientific index', max_length = 200,default=None, null=True, blank=True)
    web_of_science = models.URLField('Web of science (by Clarivate)', max_length = 200,default=None, null=True, blank=True)
    gepris = models.URLField('Gepris', max_length = 200,default=None, null=True, blank=True)
    github = models.URLField('Github', max_length = 200,default=None, null=True, blank=True)
    twitter = models.URLField('Twitter', max_length = 200,default=None, null=True, blank=True)
    wiki = models.URLField('Wikipedia', max_length = 200,default=None, null=True, blank=True)
    bluesky = models.URLField('Bluesky', max_length = 200,default=None, null=True, blank=True)
    instagram = models.URLField('Instagram', max_length = 200,default=None, null=True, blank=True)
    scholar_gps = models.URLField('Scholar GPS', max_length = 200,default=None, null=True, blank=True)
    
    url_private = models.URLField('Private URL', max_length = 200,default=None, null=True, blank=True)
    url_extern = models.URLField('Job URL', max_length = 200,default=None, null=True, blank=True, help_text="URL of profile of job website")

    prenominal = models.ForeignKey(Prenominal, default=None, on_delete = models.SET_DEFAULT, blank=True,null=True)
    additional_info = models.TextField('Additional Info', max_length=3000, blank=True, null=True)
    education = models.CharField('Education', max_length=200, default=None, null=True, blank=True)
    
    status = models.ForeignKey(Status, default=16, on_delete = models.SET_DEFAULT, blank=True)
    status_extern = models.ForeignKey(Status_extern, default=3,on_delete=models.SET_DEFAULT, blank=True)
    room = models.ManyToManyField(Room, related_name='member_room',default=None, blank=True)
    country = models.ForeignKey(Country, null=True, default=None, on_delete = models.SET_DEFAULT, blank=True)
    title = models.ForeignKey(Title_full, on_delete=models.SET_NULL, default=None, null=True, blank=True)
    groupLeading=models.ManyToManyField("Group", through="Group_group_leader", related_name="member_group_leader", blank=True)
    group = models.ManyToManyField("Group", default=None, blank=True)
    gender = models.ForeignKey(Gender, on_delete=models.SET_NULL, default=None, null=True, blank=True)
    news = models.ManyToManyField(News, through=News.member.through, related_name="member_news", blank=True)
    # author_thesis = models.ManyToManyField(Thesis, through=Thesis.author_new.through, related_name="member_author_thesis", blank=True)
    publication = models.ManyToManyField("research.Publication", default=None, blank=True, related_name="member_publication")
    project_list = models.ManyToManyField("research.Project", through="research.Project_project_member", related_name="member_project",blank=True)
    research_eq = models.ManyToManyField("research.ResearchEquipment", through="research.ResearchEquipment_responsible_person", related_name="member_research_eq",blank=True)
    presentor = models.ManyToManyField(Presentation, through=Presentation.presenter.through, related_name="member_presentation_presentor", blank=True,verbose_name="Presenter")
    author = models.ManyToManyField(Presentation, through=Presentation.author.through, related_name="member_presentation_author", blank=True,verbose_name="Author")
    # responsible_person = models.ManyToManyField(ResearchEquipment, through=ResearchEquipment.responsible_person.through, related_name="member_researchequipment_responsible", blank=True,verbose_name="Research equipment")
    # current_affiliation = models.DateField('future affiliation', null=True, default=None,blank=True, help_text='Future Affiliation.')
    psp_id=models.CharField('PSP ID (SAP)', max_length=100, default=None, null=True, blank=True)
    
    priv_phone=PhoneNumberField(null=True, blank = True)
    priv_street=models.CharField('Street name', max_length=200, default=None, null=True, blank=True)
    priv_streetNumber=models.CharField('Street number', max_length=200, default=None, null=True, blank=True)
    priv_city=models.CharField('City', max_length=200, default=None, null=True, blank=True)
    priv_postalcode=models.CharField('Postalcode', max_length=200, default=None, null=True, blank=True)
    priv_country=models.CharField('Country', max_length=200, default=None, null=True, blank=True)
    priv_matriculationnumber=models.CharField('Matriculation number', max_length=50, default=None, null=True, blank=True)
    private_info = models.TextField('Further information', max_length=3000, blank=True, null=True,help_text='Here you can add an additional adress, for example.')
    private_mail = models.EmailField('Private Email', default=None, blank=True, null=True)
    private_mobile = PhoneNumberField('Mobile Number', null = True, blank=True)
    #
    #internal
    # tac = models.DateTimeField('TAC meeting', default=None, null=True, blank=True, help_text='Next tac meeting')
    thesis_defense = models.DateTimeField('Thesis defense', default=None, null=True, blank=True)
    #
    slug=models.SlugField(max_length=50, null=True, blank=True, unique=True, help_text="URL where member is shown(if empty:givenName_lastName)")
    #
    
    
    # device = models.ForeignKey(Device, through=Device.member.through, related_name="member_device",  on_delete = models.SET_DEFAULT)


    def name(self):
        """String for representing the Model object."""
        if self.title is not None:
            return f'{self.title.title_short} {self.given_name} {self.last_name}'
        else:
            return f'{self.given_name} {self.last_name}'
        
    def name_without_title(self):
        """String for representing the Model object."""
        return f'{self.given_name} {self.last_name}'

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.given_name} {self.last_name}'

    def get_absolute_url_2(self):
        """Returns the url to access a detail record for this publication."""
        return reverse('member-detail', args=[str(self.id)])
        #return reverse('member-detail', kwargs={'slug':self.slug})
        
    def get_absolute_url(self):
        """Returns the url to access a detail record for this publication."""
        # return reverse('member-detail', args=[str(self.id)])
        return reverse('member-detail', kwargs={'slug':self.slug})

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug =  create_slug_member(self.given_name, self.last_name)
        return super().save(*args, **kwargs)
        
    class Meta:
        ordering = ['-active']

def create_slug_group(name):
    slug = slugify(name)
    if len(slug) >=55:
        slug = slug[0:50]
    qs = Group.objects.filter(slug=slug)
    exists = qs.exists()
    if exists:
        slug = slug + str(qs.first().id)
    return slug 

class Group(models.Model):
    name = models.TextField('Name', max_length=200, unique=True)
    # description = models.TextField(max_length=5000)
    show_public = models.BooleanField(default=True, help_text='Show on webpage')
    group_leader = models.ManyToManyField(Member,related_name='group_leader', default=None)
    type_choices = [ ('experiment','experiment'), ('theory','theory'),('experiment_and_theory','experiment and theory'),('facility','facility'),('incubation','incubation')]
    group_type = models.CharField(max_length=50, default='experiment', choices=type_choices, help_text='Group type',null=True)
    active = models.BooleanField(default=True, help_text='Active Group?')
    internal_group = models.BooleanField(default=True, help_text='Related Group that is not based at the chair?')
    image = models.FileField(upload_to = 'uploads/group_image/',blank=True)
    copyright = models.CharField( max_length=30,blank=True, null=True)
    group_member = models.ManyToManyField(Member, through=Member.group.through, related_name="group_member", blank=True)
    publication = models.ManyToManyField("research.Publication", through="research.Publication_group", related_name="group_publication",blank=True)
    project = models.ManyToManyField("research.Project", through="research.Project_group",related_name="group_project",blank=True)
    thesis = models.ManyToManyField("research.Thesis", through="research.Thesis_group", related_name="group_thesis",blank=True)
    patent = models.ManyToManyField("research.Patent", through="research.Patent_group", related_name="group_patent",blank=True)
    slug=models.SlugField(max_length=60, null=True, blank=True, unique=True, help_text="URL where group is shown(if empty:name[60])")
    
    def __str__(self):
        return self.name

    def get_absolute_url_2(self):
        return reverse('group-detail', args=[str(self.id)])
        
    def get_absolute_url(self):
        # return reverse('member-detail', args=[str(self.id)])
        return reverse('group-detail', kwargs={'slug':self.slug})
        
    class Meta:
        ordering = ['active']
        verbose_name = 'Group/Research line'
        verbose_name_plural = 'Groups/Research lines'
        
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug =  create_slug_group(self.name)
        return super().save(*args, **kwargs)



class Shared_document_further_files(models.Model):
    shared_document = models.ForeignKey("Shared_document", default=None, on_delete=models.CASCADE)
    sub_title = models.CharField(max_length=200, default=None, null=True,blank=True)
    description = models.TextField(max_length=15000,blank=True)
    pdf_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    pdf_file_to_download = models.BooleanField('Downloadable',default=True,)
    editable_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    editable_file_to_download = models.BooleanField('Downloadable',default=True)
    zip_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    zip_file_to_download = models.BooleanField('Downloadable',default=True)
    copyright = models.URLField(max_length=300,blank=True, null=True,help_text='Enter source URL here.')
    order_index = models.IntegerField('Index for order of sections',null=True)
    def __str__(self):
        return str(self.id)
    class Meta:
        ordering=["order_index"]
        verbose_name='Further files'


class Shared_document(models.Model):
    name = models.TextField('Name', max_length=200)
    description = models.TextField(max_length=15000,blank=True)
    video_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True,help_text='The storage requirements should not be to large. You can convert the Videos with https://handbrake.fr/ . The resolution should not be less than 1920x1080 pixels. 30 FPS should be enough.')
    pdf_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    pdf_file_to_download = models.BooleanField('Downloadable',default=True,)
    editable_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    editable_file_to_download = models.BooleanField('Downloadable',default=True)
    zip_file = models.FileField(upload_to = 'uploads/shared_documents/',blank=True)
    zip_file_to_download = models.BooleanField('Downloadable',default=True)
    
    
    copyright = models.URLField(max_length=300,blank=True, null=True,help_text='Enter source URL here.')
    
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shared_document-detail', args=[str(self.id)])
        
        
    class Meta:
        verbose_name = 'Shared document'
        verbose_name_plural = 'Shared documents'
        ordering = ['name']
        
