from django.db import models


class InfoPolitica(models.Model):
    """Model definition for InfoPolitica."""

    localidad = models.CharField(max_length=100)
    departamento = models.CharField(max_length=100)
    provincia = models.CharField(max_length=50)
    pais = models.CharField(max_length=50)

    class Meta:
        """Meta definition for InfoPolitica."""

        verbose_name = 'Informacion Politica'
        verbose_name_plural = 'Informaciones Politicas'

    def __str__(self):
        """Unicode representation of InfoPolitica."""
        return self.localidad


class AreaProtegida(models.Model):
    """Model definition for AreaProtegida."""

    nombre = models.CharField(max_length=100)

    class Meta:
        """Meta definition for AreaProtegida."""

        verbose_name = 'Area Protegida'
        verbose_name_plural = 'Areas Protegidas'

    def __str__(self):
        """Unicode representation of AreaProtegida."""
        return self.nombre
        

class FincaPrivada(models.Model):
    """Model definition for FincaPrivada."""

    nombre = models.CharField(max_length=100)

    class Meta:
        """Meta definition for FincaPrivada."""

        verbose_name = 'Finca Privada'
        verbose_name_plural = 'Fincas Privadas'

    def __str__(self):
        """Unicode representation of FincaPrivada."""
        return self.nombre

tipo_manejo = (('aprovechado', 'aprovechado'), ('no aprovechado', 'no aprovechado'))


class Sitio(models.Model):
    """Model definition for Sitio."""

    nombre = models.CharField(max_length=100)
    # info_politica = models.OneToOneField(InfoPolitica, on_delete=models.CASCADE)
    info_politica = models.ForeignKey(InfoPolitica, on_delete=models.CASCADE)
    # area_protegida = models.OneToOneField(AreaProtegida, on_delete=models.CASCADE)
    area_protegida = models.ForeignKey(AreaProtegida, on_delete=models.CASCADE)
    # finca_privada = models.OneToOneField(FincaPrivada, on_delete=models.CASCADE)
    finca_privada = models.ForeignKey(FincaPrivada, on_delete=models.CASCADE)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for Sitio."""

        verbose_name = 'Sitio'
        verbose_name_plural = 'Sitios'

    def __str__(self):
        """Unicode representation of Sitio."""
        return self.nombre


class Reino(models.Model):
    """Model definition for Reino."""

    nombre = models.CharField(max_length=50)
    observaciones = models.TextField()

    class Meta:
        """Meta definition for Reino."""

        verbose_name = 'Reino'
        verbose_name_plural = 'Reinos'

    def __str__(self):
        """Unicode representation of Reino."""
        return self.nombre


class Observacion(models.Model):
    """Model definition for Observacion."""

    nombre = models.CharField(max_length=50)

    class Meta:
        """Meta definition for Observacion."""

        verbose_name = 'Observacion'
        verbose_name_plural = 'Observaciones'

    def __str__(self):
        """Unicode representation of Observacion."""
        return self.nombre


class SitioReinoObservacion(models.Model):
    """Model definition for SitioReinoObservacion."""

    sitio = models.ForeignKey(Sitio, on_delete=models.CASCADE)
    reino = models.ForeignKey(Reino, on_delete=models.CASCADE)
    observacion = models.ForeignKey(Observacion, on_delete=models.CASCADE)

    class Meta:
        """Meta definition for SitioReinoObservacion."""

        verbose_name = 'SitioReinoObservacion'
        verbose_name_plural = 'SitiosReinosObservaciones'

    def __str__(self):
        """Unicode representation of SitioReinoObservacion."""
        return "Sitio: {} Reino: {} Observacion {}".format(self.sitio, self.reino, self.observacion)


class Autor(models.Model):
    """Model definition for Autor."""

    nombre = models.CharField(max_length=50)
    apellido = models.CharField(max_length=50)

    class Meta:
        """Meta definition for Autor."""

        verbose_name = 'Autor'
        verbose_name_plural = 'Autores'

    def __str__(self):
        """Unicode representation of Autor."""
        return self.nombre


exposiciones = (('N', 'N'), ('NE', 'NE'), ('E', 'E'), ('SE', 'SE'),
                ('S', 'S'), ('SO', 'SO'), ('O', 'O'), ('NO', 'NO'),
                ('Sin exposicion', 'Sin exposicion'))


class Parcela(models.Model):
    """Model definition for Parcela."""

    num_parcela = models.IntegerField()
    # sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    sitio_reino_observacion = models.ForeignKey(Sitio, on_delete=models.CASCADE)
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    altitud = models.DecimalField(max_digits=7, decimal_places=3)
    fecha = models.DateField(auto_now=False, auto_now_add=False)
    hora = models.TimeField(auto_now=False, auto_now_add=False)
    condicion_dia = models.CharField(max_length=100)
    fuego = models.BooleanField()
    bosteo = models.BooleanField()
    erosion = models.BooleanField()
    extraccion_gps = models.CharField(max_length=50)
    lat_extraccion = models.DecimalField(max_digits=15, decimal_places=13)
    lon_extraccion = models.DecimalField(max_digits=15, decimal_places=13)
    exposicion = models.CharField(max_length=50, choices=exposiciones)
    pendiente = models.DecimalField(max_digits=4, decimal_places=2)
    fotos_paisaje = models.CharField(max_length=50)
    grabador = models.IntegerField()
    grabador_inicio = models.DateField(auto_now=False, auto_now_add=False)
    grabador_fin = models.DateField(auto_now=False, auto_now_add=False)
    num_marca = models.IntegerField()
    marca_n = models.IntegerField()
    marca_s = models.IntegerField()
    marca_e = models.IntegerField()
    marca_o = models.IntegerField()
    cobertdosel_n = models.IntegerField()
    cobertdosel_s = models.IntegerField()
    cobertdosel_e = models.IntegerField()
    cobertdosel_o = models.IntegerField()
    sup_parcela = models.DecimalField(max_digits=6, decimal_places=4)
    num_huella = models.IntegerField('Número de huella')
    num_celda = models.IntegerField()
    catastro = models.IntegerField()
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()

    class Meta:
        """Meta definition for Parcela."""

        verbose_name = 'Parcela'
        verbose_name_plural = 'Parcelas'

    def __str__(self):
        """Unicode representation of Parcela."""
        return "Parcela Nº {}".format(self.num_parcela)


class Especie(models.Model):
    """Model definition for Especies."""

    nombre_comun = models.CharField(max_length=100)
    nombre_cientifico = models.CharField(max_length=150)
    familia = models.CharField(max_length=100, blank=True, null=True)
    fuente = models.CharField(max_length=100, blank=True, null=True)
    fuente_descripcion = models.TextField(blank=True, null=True)

    class Meta:
        """Meta definition for Especies."""

        verbose_name = 'Especie'
        verbose_name_plural = 'Especies'

    def __str__(self):
        """Unicode representation of Especies."""
        return self.nombre_cientifico


cuadrantes = (('NE', 'NE'), ('SE', 'SE'), ('SO', 'SO'), ('NO', 'NO'))

class ArbolesPie(models.Model):
    """Model definition for ArbolesPie."""

    # sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    sitio_reino_observacion = models.ForeignKey(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    cuadrante = models.CharField(max_length=50, choices=cuadrantes)
    # especie = models.OneToOneField(Especie, on_delete=models.CASCADE)
    especie = models.ForeignKey(Especie, on_delete=models.CASCADE)
    cap = models.DecimalField(max_digits=5, decimal_places=2)
    dap = models.DecimalField(max_digits=6, decimal_places=3)
    ht = models.DecimalField(max_digits=7, decimal_places=3)
    hc = models.DecimalField(max_digits=7, decimal_places=3)
    hf = models.DecimalField(max_digits=7, decimal_places=3)
    # ht = models.IntegerField()
    # hc = models.IntegerField()
    # hf = models.IntegerField()
    estado_fenologico = models.CharField(max_length=50)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for ArbolesPie."""

        verbose_name = 'ArbolesPie'
        verbose_name_plural = 'ArbolesPies'

    def __str__(self):
        """Unicode representation of ArbolesPie."""
        return "Parcela Nº {}".format(self.num_parcela)


class ArbolCaido(models.Model):
    """Model definition for ArbolesCaidos."""

    sitio_reino_observacion = models.ForeignKey(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    cuadrante = models.CharField(max_length=50, choices=cuadrantes)
    especie = models.ForeignKey(Especie, on_delete=models.CASCADE)
    ds = models.DecimalField(max_digits=6, decimal_places=3)
    dm = models.DecimalField(max_digits=6, decimal_places=3)
    di = models.DecimalField(max_digits=6, decimal_places=3)
    altura = models.DecimalField(max_digits=6, decimal_places=3)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for ArbolesCaidos."""

        verbose_name = 'Arboles Caidos'
        verbose_name_plural = 'Arboles Caidos'

    def __str__(self):
        """Unicode representation of ArbolesCaidos."""
        return "Arbol Caido N°{}".format(self.id)

class Tocon(models.Model):
    """Model definition for Tocones."""

    sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    cuadrante = models.CharField(max_length=50, choices=cuadrantes)
    diametro = models.DecimalField(max_digits=6, decimal_places=3)
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for Tocones."""

        verbose_name = 'Tocon'
        verbose_name_plural = 'Tocones'

    def __str__(self):
        """Unicode representation of Tocones."""
        return "Tocon N°{}".format(self.id)


class CuadranteSE(models.Model):
    """Model definition for Cuadrante."""

    # sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    sitio_reino_observacion = models.ForeignKey(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    especie = models.ForeignKey(Especie, on_delete=models.CASCADE)
    dab = models.DecimalField(max_digits=6, decimal_places=3)
    dap = models.DecimalField(max_digits=6, decimal_places=3)
    # ht = models.IntegerField()
    # hc = models.IntegerField()
    # hf = models.IntegerField()
    ht = models.DecimalField(max_digits=7, decimal_places=3)
    hc = models.DecimalField(max_digits=7, decimal_places=3)
    hf = models.DecimalField(max_digits=7, decimal_places=3)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for Cuadrante."""

        verbose_name = 'CuadranteSE'
        verbose_name_plural = 'Cuadrantes SE'

    def __str__(self):
        """Unicode representation of Cuadrante."""
        return "CuadranteSE n°{}".format(self.id)

arboreo_opciones = (('Presencia', 'Presencia'), ('Ausencia', 'Ausencia'))

class Subparcela(models.Model):
    """Model definition for Subparcela."""

    sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    orientacion = models.CharField(max_length=50, choices=exposiciones)
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    altitud = models.DecimalField(max_digits=7, decimal_places=3)
    hojarasca = models.DecimalField("Cobertura de Hojarasca", max_digits=4, decimal_places=2)
    hoj_profundidad = models.DecimalField("Profundidad Hojarasca", max_digits=4, decimal_places=2)
    herbacea = models.DecimalField(max_digits=4, decimal_places=2)
    her_altura = models.DecimalField("Altura media herbacea", max_digits=4, decimal_places=2)
    arbustivo = models.DecimalField(max_digits=4, decimal_places=2)
    arbust_altura = models.DecimalField("Altura media arbustivo", max_digits=4, decimal_places=2)
    arboreo = models.CharField(max_length=50, choices=arboreo_opciones)
    arbor_altura = models.DecimalField("Altura media arboreo", max_digits=5, decimal_places=2)
    erosion = models.BooleanField()
    fuego = models.BooleanField()
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    n_foto = models.CharField("Números de fotos hemisfericas", max_length=50)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()


    class Meta:
        """Meta definition for Subparcela."""

        verbose_name = 'Subparcela'
        verbose_name_plural = 'Subparcelas'

    def __str__(self):
        """Unicode representation of Subparcela."""
        return "Subparcela n°{}".format(self.id)


class Vegetacion(models.Model):
    """Model definition for Vegetacion."""

    # sitio_reino_observacion = models.OneToOneField(SitioReinoObservacion, on_delete=models.CASCADE)
    sitio_reino_observacion = models.ForeignKey(SitioReinoObservacion, on_delete=models.CASCADE)
    num_parcela = models.IntegerField()
    especie = models.ForeignKey(Especie, on_delete=models.CASCADE)
    nom_puntogps = models.CharField(max_length=50)
    lat_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    lon_puntogps = models.DecimalField(max_digits=15, decimal_places=13)
    tipo_registro = models.CharField(max_length=50)
    fecha = models.DateField(auto_now=False, auto_now_add=False)
    hexid = models.IntegerField()
    catastro = models.IntegerField()
    dap = models.DecimalField(max_digits=6, decimal_places=3)
    estado_fenologico = models.CharField(max_length=50)
    # autores = models.ForeignKey(Autor, on_delete=models.CASCADE)
    autores = models.ManyToManyField(Autor)
    observaciones = models.TextField()

    class Meta:
        """Meta definition for Vegetacion."""

        verbose_name = 'Información de Vegetación No Sistematica'
        verbose_name_plural = 'Informaciones de Vegetación No Sistematica'

    def __str__(self):
        """Unicode representation of Vegetación."""
        return "Información de Vegetación No Sistematica N°{}".format(self.id)
