from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

'''class Rilievo(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    file = models.FileField(upload_to='rilievi/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.file.name'''

def user_input_directory_path(instance, filename):
    # file sarà salvato in MEDIA_ROOT/<username>/input/<filename>
    #return f'{instance.user.username}/input/{filename}'
    return f'{instance.user.userprofile.azienda.nome_azienda}/input/{filename}'
def user_output_directory_path(instance, filename):
    # file sarà salvato in MEDIA_ROOT/<username>/output/<filename>
    #return f'{instance.user.username}/output/{filename}'
    return f'{instance.azienda}/output/{filename}'
def user_kml_directory_path(instance, filename):
    # file sarà salvato in MEDIA_ROOT/<username>/output/<filename>
    #return f'{instance.user.username}/output/{filename}'
    return f'{instance.azienda}/kml/{filename}'

class Azienda(models.Model):
    nome_azienda = models.CharField(max_length=255, unique=True)
    partita_iva = models.CharField(max_length=11, unique=True)  # Assumendo che la partita IVA sia di 11 cifre in Italia
    mail_referente = models.EmailField(max_length=255)
    telefono_referente = models.CharField(max_length=20)  # Usa CharField per includere anche il prefisso
    pec = models.EmailField(max_length=255)
    indirizzo_legale = models.CharField(max_length=255)

    n_file_elab = models.IntegerField( null=True, default=0)
    giga_elab = models.FloatField( null=True, default=0.00)
    m2_elab = models.FloatField( null=True, default=0.00)
    tempo_medio_elab = models.FloatField( null=True, default=0.00)
    tempo_tot_elab = models.FloatField( null=True, default=0.00)
    metri_lineari_ril = models.FloatField( null=True, default=0.00)
    privacy_mode = models.BooleanField(default=False, help_text="Se abilitato, ogni utente può vedere solo i propri rilievi. Se disabilitato, tutti gli utenti dell'azienda vedono tutti i rilievi dell'azienda.")

#n. file elaborati, giga elaborati, m2 elaborati, tempo elaborazione medio(h/m2), tempo totale di elaborazione,
#metri lineari sottoservizi rilevati
    def __str__(self):
        return self.nome_azienda


class Rilievi(models.Model):
    STATUS_CHOICES = [
        (0, 'In Coda'),
        (1, 'In Elaborazione'),
        (2, 'Elaborato'),
        (3, 'Errore'),
    ]
    PRIORITY_CHOICES = [
        (0, 'Bassa'),
        (1, 'Media'),
        (2, 'Alta'),
    ]
    SURVEY_TYPE_CHOICES = [
        ('GPR', 'GPR'),
        ('MAG', 'MAG'),
        ('FOTO', 'FOTO'),
        ('ALTR', 'Altro'),
    ]
    SURVEY_VECTOR_CHOICES = [
        ('ARL', 'Aereo'),
        ('HND', 'Manuale'),
        ('VHCL', 'Veicolo'),
        ('ALTR', 'Altro'),
    ]
    nome_file = models.CharField(max_length=255)
    nome_rilievo = models.CharField(max_length=255)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    azienda = models.ForeignKey(Azienda, on_delete=models.SET_NULL, null=True, blank=True)
    survey_type = models.CharField(max_length=4, choices=SURVEY_TYPE_CHOICES, default='GPR')
    survey_vector = models.CharField(max_length=10, choices=SURVEY_VECTOR_CHOICES, default='')
    file_input = models.FileField(upload_to=user_input_directory_path)
    created_at_input = models.DateTimeField(default=timezone.now)
    file_output = models.FileField(upload_to=user_output_directory_path, null=True)
    created_at_output = models.DateTimeField(null=True, blank=True)
    stato = models.IntegerField(choices=STATUS_CHOICES, default=0)
    priorita = models.IntegerField(choices=PRIORITY_CHOICES, default=1)
    shapefile = models.FileField(upload_to=user_kml_directory_path, null=True)#o shapefile
    m2 = models.FloatField( null=True, default=0.00)
    latitudine =models.FloatField( null=True, default=0.00)
    longitudine = models.FloatField( null=True, default=0.00)
    dimensione = models.FloatField( null=True, default=0.00)
    metri_sottoservizi = models.FloatField( null=True, default=0.00)
    t_elab = models.FloatField( null=True, default=0.00)
    numero_anomalie = models.IntegerField(null=True, default=0, help_text="Numero di anomalie trovate (per rilievi Magnetometro)")



    def __str__(self):
        return f"{self.nome_file} caricato da {self.user.username}"

'''class RilieviElaborati(models.Model):
    nome_file = models.CharField(max_length=255)
    file = models.FileField(upload_to=user_output_directory_path)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    azienda = models.ForeignKey(Azienda, on_delete=models.SET_NULL, null=True, blank=True)
    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f"{self.nome_file} elaborato per {self.user.username}"
'''

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    azienda = models.ForeignKey(Azienda, on_delete=models.SET_NULL, null=True, blank=True)  # Riferimento all'azienda

    def __str__(self):
        return self.user.username

class AccessLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    login_time = models.DateTimeField(auto_now_add=True)
    ip_address = models.GenericIPAddressField(null=True, blank=True)

    def __str__(self):
        return f"{self.user.username} - {self.login_time}"