# coding: utf-8
"""Este módulo contém os modelos relativos aos temas da categoria Abastecimento
de Àgua e Saneamento Básico
"""
from django.utils.translation import ugettext as _
from django.contrib.gis.db import models
from clone.comum.models import GeometriaAproximadaMixIn, NomeNomeAbreviadoMixIn, ClasseCnae
from clone.comum.choices import SITUACAO_FISICA_CHOICES, MATERIAL_CONSTRUCAO_CHOICES, RELIGIAO_CHOICES, ADMINISTRACAO_CHOICES
from clone.settings import SRID_PROJETO
from clone.abastecimento.choices import TIPO_EDIFICACAO_ABASTECIMENTO_CHOICES, TIPO_DEPOSITO_ABASTECIMENTO_CHOICES, FINALIDADE_ABASTECIMENTO_AGUA_CHOICES, TIPO_CEMITERIO_CHOICES



class ComplexoAbastecimentoAgua(NomeNomeAbreviadoMixIn,
                                models.Model):

    """Conjunto de elementos agregados envolvendo
    componentes de um sistema de abastacimento
    de água"""

    tipo_classe_cnae = models.ForeignKey(ClasseCnae,
                                         verbose_name=_(u"Classe CNAE"),
                                         help_text=_(u"Indica o tipo da classe de atividade, segundo a CNAE."))

    organizacao = models.CharField(max_length=100,
                                   verbose_name=_(u"Organização"),
                                   help_text=_(u"Indica o agente público ou concessionário que administra ou explora o complexo de abastecimento de água."),
                                   null=True,
                                   blank=True)

    objects = models.GeoManager()

    class Meta:
        verbose_name = _(u"Complexo de Abastecimento de Água")
        verbose_name_plural = _(u"Complexos de Abastecimento de Água")

class AreaAbastecimentoAgua(GeometriaAproximadaMixIn,
                            models.Model):

    """Polígono que envolve componentes do sistema de abastecimento
    de água."""

    complexo = models.ForeignKey(ComplexoAbastecimentoAgua,
                                 verbose_name=_(u"Complexo de Abastecimento Água"),
                                 help_text=_(u"Complexo a qual esta área de abastecimento pertence."),
                                 null=True,
                                 blank=True)

    geometria = models.PolygonField(srid=SRID_PROJETO,
                                    verbose_name=_(u"Geometria"),
                                    help_text=_(u"Geometria (polígono)"))

    objects = models.GeoManager()

    class Meta:

        verbose_name = _(u"Área de Abastecimento")
        verbose_name_plural = _(u"Áreas de Abastecimento")


class EdificacaoAbastecimentoAguaBase(GeometriaAproximadaMixIn,
                                      NomeNomeAbreviadoMixIn,
                                      models.Model):

    """Edificação compoenente de um sistema de abastecimento de água.
    Classe base, não cria tabela na base de dados, apenas provê a
    estrutura para as classes filhas."""

    tipo_edificacao_abastecimento = models.CharField(max_length=17,
                                                     verbose_name=_(u"Tipo de Edificação de Abastecimento"),
                                                     help_text=_(u"Indica o tipo de edificação de abastecimento e consumo de água."),
                                                     choices=TIPO_EDIFICACAO_ABASTECIMENTO_CHOICES)

    operacional = models.NullBooleanField(verbose_name=_(u"Operacional"),
                                          help_text=_(u"Indica se a edificação está operacional."))

    situacao_fisica = models.CharField(max_length=13,
                                       verbose_name=_(u"Situação Física"),
                                       help_text=_(u"Identifica a situação quanto a atividade atual da edificação."),
                                       choices=SITUACAO_FISICA_CHOICES)

    material_construcao = models.CharField(max_length=12,
                                           verbose_name=_(u"Material Construção"),
                                           help_text=_(u"Indica o tipo de material de construção predominante."))

    class Meta:
        verbose_name = _(u"Edificação Abastecimento de Água")
        verbose_name_plural = _(u"Edificações Abastecimento de Água")
        abstract = True


class EdificacaoAbastecimentoAguaPoligono(EdificacaoAbastecimentoAguaBase):

    """Edificação compoenente de um sistema de abastecimento de água
    com a geometria poligonal"""

    complexo = models.ForeignKey(ComplexoAbastecimentoAgua,
                                 verbose_name=_(u"Complexo de Abastecimento Água"),
                                 help_text=_(u"Complexo a qual esta área de abastecimento pertence."),
                                 null=True,
                                 blank=True)

    geometria = models.PolygonField(srid=SRID_PROJETO,
                                    verbose_name=_(u"Geometria"),
                                    help_text=_(u"Geometria (polígono)"))

    objects = models.GeoManager()

    class Meta:

        verbose_name = _(u"Edificação Abastecimento de Água (polígono)")
        verbose_name_plural = _(u"Edificações Abastecimento de Água (polígono)")

class EdificacaoAbastecimentoAguaPonto(EdificacaoAbastecimentoAguaBase):

    """Edificação compoenente de um sistema de abastecimento de água
    com a geometria pontual."""

    complexo = models.ForeignKey(ComplexoAbastecimentoAgua,
                                 verbose_name=_(u"Complexo de Abastecimento Água"),
                                 help_text=_(u"Complexo a qual esta área de abastecimento pertence."),
                                 null=True,
                                 blank=True)

    geometria = models.PointField(srid=SRID_PROJETO,
                                  verbose_name=_(u"Geometria"),
                                  help_text=_(u"Geometria (ponto)"))

    objects = models.GeoManager()

    class Meta:
        verbose_name = _(u"Edificação Abastecimento de Água (ponto)")
        verbose_name_plural = _(u"Edificações Abastecimento de Água (ponto)")

class DepositoAbastecimentoAguaBase(GeometriaAproximadaMixIn,
                                    NomeNomeAbreviadoMixIn,
                                    models.Model):

    tipo_deposito_abastecimento = models.CharField(max_length=12,
                                                   verbose_name=_(u"TIpo de Depósito de Abastecimento"),
                                                   help_text=_(u"Indica o tipo de depósito de abastecimento de água."),
                                                   choices=TIPO_DEPOSITO_ABASTECIMENTO_CHOICES)

    situacao_agua = models.NullBooleanField(verbose_name=_(u"Situação Água"),
                                            help_text=_(u"Indica a situação da água contida no depósito."))

    construcao = models.BooleanField(verbose_name=_(u"Construção"),
                                     help_text=_(u"Indica a situação da construção do depósito de abastecimento de água."))

    situacao_fisica = models.CharField(max_length=13,
                                       verbose_name=_(u"Situação Física"),
                                       help_text=_(u"Identifica a situação quanto a atividade atual da edificação."),
                                       choices=SITUACAO_FISICA_CHOICES)

    material_construcao = models.CharField(max_length=12,
                                           verbose_name=_(u"Material Construção"),
                                           help_text=_(u"Indica o tipo de material de construção predominante."))

    operacional = models.NullBooleanField(verbose_name=_(u"Operacional"),
                                          help_text=_(u"Indica se a edificação está operacional."))

    finalidade = models.CharField(max_length=12,
                                  verbose_name=_(u"Finalidade"),
                                  help_text=_(u"Indica a finalidade do depósito de abastecimento de água."),
                                  choices=FINALIDADE_ABASTECIMENTO_AGUA_CHOICES)
    
    class Meta:
        verbose_name = _(u"Departamento Abastecimento de Água")
        verbose_name_plural = _(u"Departamentos Abastecimento de Água")
        abstract = True

class DepositoAbastecimentoAguaPoligono(DepositoAbastecimentoAguaBase):

    """Depósito de abastecimento de água poligonal"""

    complexo = models.ForeignKey(ComplexoAbastecimentoAgua,
                                 verbose_name=_(u"Complexo de Abastecimento Água"),
                                 help_text=_(u"Complexo a qual esta área de abastecimento pertence."),
                                 null=True,
                                 blank=True)

    geometria = models.PolygonField(srid=SRID_PROJETO,
                                    verbose_name=_(u"Geometria"),
                                    help_text=_(u"Geometria (polígono)"))

    objects = models.GeoManager()

    class Meta:

        verbose_name = u"Depósito de Abastecimento (polígono)"
        verbose_name_plural = u"Depósitos de Abastecimento (polígono)"


class DepositoAbastecimentoAguaPonto(DepositoAbastecimentoAguaBase):

    """Depósito de abastecimento de água pontual"""

    complexo = models.ForeignKey(ComplexoAbastecimentoAgua,
                                 verbose_name=_(u"Complexo de Abastecimento Água"),
                                 help_text=_(u"Complexo a qual esta área de abastecimento pertence."),
                                 null=True,
                                 blank=True)

    geometria = models.PointField(srid=SRID_PROJETO,
                                  verbose_name=_(u"Geometria"),
                                  help_text=_(u"Geometria (ponto)"))

    objects = models.GeoManager()

    class Meta:

        verbose_name = u"Depósito de Abastecimento (ponto)"
        verbose_name_plural = u"Depósitos de Abastecimento (ponto)"


class Cemiterio(GeometriaAproximadaMixIn,
                NomeNomeAbreviadoMixIn,
                models.Model):

    """Terreno ou recinto onde se guardam os restos mortais
    de pessoas ou animais (inclusive tumulos isolados)"""

    tipo = models.CharField(max_length=12,
                            verbose_name=u"Tipo de Cemitério",
                            help_text=u"Indica o tipo do cemitério.",
                            choices=TIPO_CEMITERIO_CHOICES)

    denominacao_associada = models.CharField(max_length=12,
                                             verbose_name=u"Denonimação Associada",
                                             help_text=u"Denonimação associada a religião, seita ou filosofia.",
                                             null=True,
                                             blank=True,
                                             choices=RELIGIAO_CHOICES)

    class Meta:
      abstract = True

class CemiterioPonto(Cemiterio):

    """Feição pontual do tipo cemitério"""

    geometria = models.PointField(verbose_name=u"Geometria",
                                  help_text=u"Geometria (pontual)",
                                  srid=SRID_PROJETO)

    objects = models.GeoManager()

    class Meta:
        verbose_name = u"Cemitério (ponto)"
        verbose_name_plural = u"Cemitérios (ponto)"

class CemiterioPoligono(CemiterioPoligono):

    """Feição poligonal do tipo cemitério"""

    geometria = models.PolygonField(verbose_name=u"Geometria",
                                    help_text=u"Geometria (poligonal)",
                                    srid=SRID_PROJETO)

    objects = models.GeoManager()

    class Meta:
        verbose_name = u"Cemitério (polígono)"
        verbose_name_plural = u"Cemitérios (polígono)"

class ComplexoSaneamento(NomeNomeAbreviadoMixIn,
                         models.Model):

    """Conjunto de elementos agregados envolvendo componentes de um
    sistema de sanemaneto básico"""

    tipo_classe_cnae = models.ForeignKey(ClasseCnae,
                                         verbose_name=_(u"Classe CNAE"),
                                         help_text=_(u"Indica o tipo da classe de atividade, segundo a CNAE."))

    administracao = models.CharField(max_length=13,
                                     verbose_name=_(u"Administração"),
                                     help_text=_(u"Indica a esfera administrativa responsável pela administração do complexo de saneamento."),
                                     choices=ADMINISTRACAO_CHOICES)

    organizacao = models.CharField(max_length=100,
                                   verbose_name=_(u"Organização"),
                                   help_text=_(u"Indica o agente público ou concessionário que administra ou explora o complexo de abastecimento de água."),
                                   null=True,
                                   blank=True)

    class Meta:
        verbose_name = _(u"Complexo de Saneamento")
        verbose_name_plural = _(u"Complexos de Saneamento")    


class AreaSaneamento(GeometriaAproximadaMixIn,
                     models.Model):

    """Polígono que envolve os componentes do sistema de saneamento
    básico"""

    geometria = models.PolygonField(srid=SRID_PROJETO,
                                    verbose_name=_(u"Geometria"),
                                    help_text=_(u"Geometria (polígono)"))

class EdificacaoSaneamento(GeometriaAproximadaMixIn,
                           NomeNomeAbreviadoMixIn,
                           models.Model):

    """Edificação componente de um sistema de saneamento, quer seja de resíduos
    líquidos, quer seja de resíduos sólidos."""

    tipo_edificacao_saneamento = models.CharField(max_length=20,
                                                  verbose_name=_(u"Tipo de Edificação de Saneamento"),
                                                  help_text=_(u"Indica o tipo de edificação de saneamento"),
                                                  choices=TIPO_EDIFICACAO_SANEAMENTO_CHOICES)

    operacional = models.NullBooleanField(verbose_name=_(u"Operacional"),
                                          help_text=_(u"Indica se a edificação está operacional."))

    situacao_fisica = models.CharField(max_length=13,
                                       verbose_name=_(u"Situação Física"),
                                       help_text=_(u"Identifica a situação quanto a atividade atual da edificação."),
                                       choices=SITUACAO_FISICA_CHOICES)

    material_construcao = models.CharField(max_length=12,
                                           verbose_name=_(u"Material Construção"),
                                           help_text=_(u"Indica o tipo de material de construção predominante."))

    class Meta:

        abstract = True

class EdificacaoSaneamentoPonto(EdificacaoSaneamento):

    """Edificação saneamento do tipo ponto"""

    objects = models.GeoManager()

    geometria = models.PointField(srid=SRID_PROJETO,
                                  verbose_name=_(u"Geometria"),
                                  help_text=_(u"Geometria (pontual)"))

    class Meta:

        verbose_name = _(u"Edificação de Saneamento (ponto)")
        verbose_name_plural = _(u"Edificações de Saneamento (ponto)")

class EdificacaoSaneamentoPoligono(EdificacaoSaneamento):

    """Edificação saneamento do tipo poligono"""

    objects = models.GeoManager()

    geometria = models.PolygonField(srid=SRID_PROJETO,
                                    verbose_name=_(u"Geometria"),
                                    help_text=_(u"Geometria (poligonal)"))


    class Meta:

        verbose_name = _(u"Edificação de Saneamento (polígono)")
        verbose_name_plural = _(u"Edificações de Saneamento (polígono)")


class DepositoSaneamento(GeometriaAproximadaMixIn,
                         NomeNomeAbreviadoMixIn,
                         models.Model):

    tipo_deposito_saneamento = models.CharField(max_length=18,
                                                verbose_name=_(u"Tipo de Depósito de Saneamento"),
                                                help_text=_(u"Indica o tipo de depósito de saneamento."),
                                                choices=TIPO_DEPOSITO_SANEAMENTO_CHOICES)

    operacional = models.NullBooleanField(verbose_name=_(u"Operacional"),
                                          help_text=_(u"Indica se a edificação está operacional."))

    situacao_fisica = models.CharField(max_length=13,
                                       verbose_name=_(u"Situação Física"),
                                       help_text=_(u"Identifica a situação quanto a atividade atual da edificação."),
                                       choices=SITUACAO_FISICA_CHOICES)

    material_construcao = models.CharField(max_length=12,
                                           verbose_name=_(u"Material Construção"),
                                           help_text=_(u"Indica o tipo de material de construção predominante."))

    finalidade

    construcao

    residuo

    tipo_residuo