'''
App Models

'''

import itertools

from django.conf import settings


from django.db import models

from django.utils.translation import ugettext as _
from django_mysql.models import ListCharField

from tinymce.models import HTMLField


class TimeStampModel(models.Model):
    '''Time stamp model '''

    create_date = models.DateTimeField('Created Date', auto_now_add=True)
    modify_date = models.DateTimeField('Updated Date',auto_now=True)

    class Meta():
        abstract = True

class EmailMessage(TimeStampModel):
    '''
    Email Model

    '''

    PENDING = 1
    INPROGRESS = 2
    SENT = 3
    ERROR = 4

    STATUS_TYPE = (
        (PENDING, _('Pending')),
        (INPROGRESS, _('In-Progress')),
        (SENT, _('Sent')),
        (ERROR, _('Error'))
    )

    from_email = models.CharField(
        max_length=255)
    to_email = models.EmailField(max_length=255)
    cc = ListCharField(models.EmailField(max_length=255), blank=True, max_length=1000, null=True)
    subject = models.CharField(max_length=200, null=True, blank=True)
    html_message = HTMLField()
    tries = models.PositiveSmallIntegerField(default=0)
    error_detail = models.CharField(max_length=255, null=True, blank=True)
    sent_status = models.SmallIntegerField(
        choices=STATUS_TYPE, default=1)
    sent_date = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return '%s' % (self.to_email)

    class Meta:
        ''' Email Messages Class Meta '''
        verbose_name = 'EmailMessage'
        verbose_name_plural = 'EmailMessages'
        db_table = 'Email Messages'



class AppVersion(TimeStampModel):
    '''
    models for AppVersion

    '''
    app_version = models.CharField(max_length=10)
    app_version_code = models.IntegerField(default=0)
    comment = models.CharField(max_length=244, blank=True, null=True)
    is_active = models.BooleanField(default=False)


    def __str__(self):
        return '%s' % (self.app_version)

    class Meta:
        ''' User Class Meta '''
        verbose_name = 'AppVersion'
        verbose_name_plural = 'AppVersion'
        db_table = 'App Version'


class UserDevice(TimeStampModel):
    """
    model for App User Device

    """

    DEVICE_ANDROID = 1
    DEVICE_OS = 2

    DEVICE_TYPES = (
        (DEVICE_ANDROID, 'ANDROID'),
        (DEVICE_OS, 'IOS'),
    )

    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,
                             related_name='user_device')
    device_token = models.CharField(max_length=200, blank=True)
    device_id = models.CharField(max_length=500)
    device_type = models.SmallIntegerField(
        default=DEVICE_ANDROID, choices=DEVICE_TYPES)
    is_active = models.BooleanField(default=False,
                                    help_text=_('Designates whether the App '
                                                'User Device is active or '
                                                'not '))
    is_device_token_valid = models.BooleanField(default=True,
                                                help_text=_('Designates whether the'
                                                            'User Device token is valid or'
                                                            ' not '))


    def __str__(self):
        return '%s' % (self.user.email)

    class Meta:
        ''' User Device Class Meta '''
        verbose_name = 'UserDevice'
        verbose_name_plural = 'UserDevice'
        db_table = 'UserDevice'


class Country(TimeStampModel):
    '''
    Country Model

    '''
    country_code = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return '%s' % (self.name)

    class Meta(object):
        """
        inner class

        """
        verbose_name = 'Country'
        verbose_name_plural = 'Countries'
        db_table = 'country'




class State(TimeStampModel):
    '''
    State Model

    '''
    country = models.ForeignKey(Country, related_name="state_country", on_delete=models.CASCADE)
    state_code = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return '%s' % (self.name)

    class Meta(object):
        """
        inner class

        """
        verbose_name = 'State'
        verbose_name_plural = 'States'
        db_table = 'State'


class City(TimeStampModel):
    '''
    Country Model

    '''
    state = models.ForeignKey(State, related_name="city_state", on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return '%s' % (self.name)

    class Meta(object):
        """
        inner class

        """
        verbose_name = 'City'
        verbose_name_plural = 'cities'
        db_table = 'City'

