# coding=utf-8
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from django.db import models
from autoslug import AutoSlugField
from django.utils.translation import ugettext_lazy as _
from libs.currency_utils import CurrencyUtils
from simple_history.models import HistoricalRecords
from planing_tool.models.levels import Level
from planing_tool.models.plazas import Plaza
from planing_tool.models.soportes import Soporte
from planing_tool.models.medios import NombreMedio
from planing_tool.models.comments import Comment
from planing_tool.models.programas import Programa
from planing_tool.models.cotizaciones import Cotizacion
from recurrence.fields import RecurrenceField

DESCRIPCION_METODO = (
    (0, _(u"Monto Fijo")),
    (1, _(u"Porcentaje sobre Bruto")),
    (2, _(u"Porcentaje sobre el Saldo"))
)


FORMAS_DE_PAGO = (
    (0, _(u"Otros")),
    (1, _(u"Contado")),
    (2, _(u"Cheque")),
    (3, _(u"Transferencia")),
    (4, _(u"Tarjeta de Crédito"))
)


PLAZO_DE_PAGO = (
    (0, _(u"Otros ")),
    (1, _(u"Inmediato")),
    (2, _(u"7 días")),
    (3, _(u"15 días")),
    (4, _(u"30 días")),
    (5, _(u"60 días")),
    (6, _(u"90 días"))
)


class Pauta(Level):
    """
        Nivel de Jerarquia mas bajo,
        una pauta representa una tactia o
        estrategia asociada a un soporte y medio
    """

    slug = AutoSlugField(
        max_length=250, populate_from='descripcion',
        always_update=True,
        unique=True
    )

    descripcion = models.TextField(
        verbose_name=_(u'Descripción'),
        null=True,
        help_text='Descripción de la Pauta. 999 caracteres maximo'
    )

    desde = models.DateTimeField(
        default=datetime.now()+timedelta(days=7),
        null=False,
        blank=False,
        verbose_name=_(u"Fecha de inicio"),
        help_text='Inicio de la pauta'
    )

    hasta = models.DateTimeField(
        default=datetime.now()+timedelta(days=7),
        null=False,
        blank=False,
        verbose_name=_(u"Fecha de cierre"),
        help_text='Fin de la pauta'
    )

    monto = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Costo"),
        help_text='Costo'
    )

    currency = models.IntegerField(
        default=1, choices=CurrencyUtils.CURRENCY_CHOICES,
        db_index=True,
        verbose_name=_(u"Moneda")
    )

    tirada = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Tirada")
    )

    readership = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Readership")
    )

    raiting = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Rating")
    )

    total_menciones = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Total de menciones")
    )

    poblacion = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Población")
    )

    penetracion_soporte = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Penetración soporte")
    )

    forma_de_pago = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Forma de pago'),
        choices=FORMAS_DE_PAGO
    )

    plazo_de_pago = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Plazo de pago'),
        choices=PLAZO_DE_PAGO
    )

    especificaciones_iva = models.TextField(
        verbose_name=_(u'Especificaciones del iva'),
        null=True,
        blank=True,
        default=None,
        help_text='Especificaciones del iva'
    )

    otras_formas_y_plazos = models.TextField(
        verbose_name=_(u'Otras formas de pago y plazos'),
        null=True,
        blank=True,
        default=None,
        help_text='Otras formas de pago y plazos'
    )

    plaza = models.ForeignKey(
        Plaza,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Plaza donde impactará")
    )

    medio = models.ForeignKey(
        NombreMedio,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Nombre del Medio de Comunicación")
    )

    programa = models.ForeignKey(
        Programa,
        verbose_name=_(u"Programa"),
        null=True,
        blank=True,
        default=None,
    )

    soporte = models.ForeignKey(
        Soporte,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Soporte Necesario")
    )

    history = HistoricalRecords()
    frecuencia = RecurrenceField()

    cotizacion = models.ForeignKey(
        Cotizacion,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Cotizacion"),
        related_name='Cotizacion'
    )

    @property
    def puntos_brutos_rating(self):
        return self.rating*self.total_menciones

    @property
    def costo_puntos_brutos_rating(self):
        """Costo PBR: importe neto/PBR """
        return self.monto / self.puntos_brutos_rating

    @property
    def cobertura_soportes(self):
        """Cobertura soportes: penetración soporte x población/100"""
        return self.penetracion_soporte * self.soporte/100

    @property
    def impactos_totales(self):
        """Impactos totales: PBR x población/100"""
        return self.puntos_brutos_rating * self.poblacion/100

    @property
    def impactos_por_persona(self):
        """Impactos por persona: impactos totales/población"""
        return self.impactos_totales / self.poblacion

    @property
    def costo_por_contacto(self):
        """Costo por contacto: inversión/impactos"""
        return self.monto/self.impactos_totales

    def __unicode__(self):
        return self.descripcion


class Beneficio(models.Model):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Beneficio"),
        related_name='Beneficio'
    )

    descripcion = models.TextField(
        verbose_name=_(u'Descripción'),
        null=True,
        help_text='Descripción del Beneficio. 999 caracteres maximo'
    )


class Descuento(models.Model):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Descuento"),
        related_name='Descuento'
    )

    metodo = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Descuento aplicado a una Pauta'),
        choices=DESCRIPCION_METODO
    )

    valor = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, db_index=True, verbose_name=_(u"Costo")
    )

    currency = models.IntegerField(
        default=1, choices=CurrencyUtils.CURRENCY_CHOICES,
        db_index=True, verbose_name=_(u"Moneda")
    )


class ObservacionPautas (Comment):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Observacion"),
        related_name='ObservacionPautas'
    )

# coding=utf-8
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from django.db import models
from autoslug import AutoSlugField
from django.utils.translation import ugettext_lazy as _
from libs.currency_utils import CurrencyUtils
from simple_history.models import HistoricalRecords
from planing_tool.models.levels import Level
from planing_tool.models.plazas import Plaza
from planing_tool.models.soportes import Soporte
from planing_tool.models.medios import NombreMedio
from planing_tool.models.comments import Comment
from planing_tool.models.programas import Programa
from planing_tool.models.cotizaciones import Cotizacion
from recurrence.fields import RecurrenceField

DESCRIPCION_METODO = (
    (0, _(u"Monto Fijo")),
    (1, _(u"Porcentaje sobre Bruto")),
    (2, _(u"Porcentaje sobre el Saldo"))
)


FORMAS_DE_PAGO = (
    (0, _(u"Otros")),
    (1, _(u"Contado")),
    (2, _(u"Cheque")),
    (3, _(u"Transferencia")),
    (4, _(u"Tarjeta de Crédito"))
)


PLAZO_DE_PAGO = (
    (0, _(u"Otros ")),
    (1, _(u"Inmediato")),
    (2, _(u"7 días")),
    (3, _(u"15 días")),
    (4, _(u"30 días")),
    (5, _(u"60 días")),
    (6, _(u"90 días"))
)


class Pauta(Level):
    """
        Nivel de Jerarquia mas bajo,
        una pauta representa una tactia o
        estrategia asociada a un soporte y medio
    """

    slug = AutoSlugField(
        max_length=250, populate_from='descripcion',
        always_update=True,
        unique=True
    )

    descripcion = models.TextField(
        verbose_name=_(u'Descripción'),
        null=True,
        help_text='Descripción de la Pauta. 999 caracteres maximo'
    )

    desde = models.DateTimeField(
        default=datetime.now()+timedelta(days=7),
        null=False,
        blank=False,
        verbose_name=_(u"Fecha de inicio"),
        help_text='Inicio de la pauta'
    )

    hasta = models.DateTimeField(
        default=datetime.now()+timedelta(days=7),
        null=False,
        blank=False,
        verbose_name=_(u"Fecha de cierre"),
        help_text='Fin de la pauta'
    )

    monto = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Costo"),
        help_text='Costo'
    )

    currency = models.IntegerField(
        default=1, choices=CurrencyUtils.CURRENCY_CHOICES,
        db_index=True,
        verbose_name=_(u"Moneda")
    )

    tirada = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Tirada")
    )

    readership = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Readership")
    )

    raiting = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Rating")
    )

    total_menciones = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Total de menciones")
    )

    poblacion = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Población")
    )

    penetracion_soporte = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, verbose_name=_(u"Penetración soporte")
    )

    forma_de_pago = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Forma de pago'),
        choices=FORMAS_DE_PAGO
    )

    plazo_de_pago = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Plazo de pago'),
        choices=PLAZO_DE_PAGO
    )

    especificaciones_iva = models.TextField(
        verbose_name=_(u'Especificaciones del iva'),
        null=True,
        blank=True,
        default=None,
        help_text='Especificaciones del iva'
    )

    otras_formas_y_plazos = models.TextField(
        verbose_name=_(u'Otras formas de pago y plazos'),
        null=True,
        blank=True,
        default=None,
        help_text='Otras formas de pago y plazos'
    )

    plaza = models.ForeignKey(
        Plaza,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Plaza donde impactará")
    )

    medio = models.ForeignKey(
        NombreMedio,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Nombre del Medio de Comunicación")
    )

    programa = models.ForeignKey(
        Programa,
        verbose_name=_(u"Programa"),
        null=True,
        blank=True,
        default=None,
    )

    soporte = models.ForeignKey(
        Soporte,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Soporte Necesario")
    )

    history = HistoricalRecords()
    frecuencia = RecurrenceField()

    cotizacion = models.ForeignKey(
        Cotizacion,
        null=True,
        blank=True,
        default=None,
        verbose_name=_(u"Cotizacion"),
        related_name='Cotizacion'
    )

    @property
    def puntos_brutos_rating(self):
        return self.rating*self.total_menciones

    @property
    def costo_puntos_brutos_rating(self):
        """Costo PBR: importe neto/PBR """
        return self.monto / self.puntos_brutos_rating

    @property
    def cobertura_soportes(self):
        """Cobertura soportes: penetración soporte x población/100"""
        return self.penetracion_soporte * self.soporte/100

    @property
    def impactos_totales(self):
        """Impactos totales: PBR x población/100"""
        return self.puntos_brutos_rating * self.poblacion/100

    @property
    def impactos_por_persona(self):
        """Impactos por persona: impactos totales/población"""
        return self.impactos_totales / self.poblacion

    @property
    def costo_por_contacto(self):
        """Costo por contacto: inversión/impactos"""
        return self.monto/self.impactos_totales

    def __unicode__(self):
        return self.descripcion


class Beneficio(models.Model):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Beneficio"),
        related_name='Beneficio'
    )

    descripcion = models.TextField(
        verbose_name=_(u'Descripción'),
        null=True,
        help_text='Descripción del Beneficio. 999 caracteres maximo'
    )


class Descuento(models.Model):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Descuento"),
        related_name='Descuento'
    )

    metodo = models.IntegerField(
        max_length=3,
        verbose_name=_(u'Descuento aplicado a una Pauta'),
        choices=DESCRIPCION_METODO
    )

    valor = models.DecimalField(
        max_digits=20, decimal_places=2, blank=True,
        null=True, db_index=True, verbose_name=_(u"Costo")
    )

    currency = models.IntegerField(
        default=1, choices=CurrencyUtils.CURRENCY_CHOICES,
        db_index=True, verbose_name=_(u"Moneda")
    )


class ObservacionPautas (Comment):
    pauta = models.ForeignKey(
        Pauta,
        verbose_name=_(u"Observacion"),
        related_name='ObservacionPautas'
    )

# coding=utf-8 # -*- coding: utf-8 -*- Nivel de Jerarquia mas bajo,         una pauta representa una tactia o         estrategia asociada a un soporte y medio Costo PBR: importe neto/PBR Cobertura soportes: penetración soporte x población/100 Impactos totales: PBR x población/100 Impactos por persona: impactos totales/población Costo por contacto: inversión/impactos