'''
Accounts Models
'''
import itertools
import random
from slugify import slugify
from django.conf import settings
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager,
                                        PermissionsMixin)

from django.db import models
from app.models import State, City, Country
from django.db.models import Q


class UserManager(BaseUserManager):
    '''
    User Custom Manager
    '''

    def create_user(self, email=None, password=None):
        '''
        Create User
        '''
        if not email:
            raise ValueError('User must have a email address')
        user = self.model(email=self.normalize_email(email))
        user.is_active = True
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        '''
        Create Superuser
        '''
        user = self.create_user(email, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser, PermissionsMixin):
    '''
    If no need to use UserGroups/Permissions then remove PermissionsMixin
    '''
    email = models.EmailField(
        'Email Address', unique=True, blank=True, null=True)
    first_name = models.CharField('First Name', max_length=20, db_index=True)
    last_name = models.CharField('Last Name', max_length=20, db_index=True)
    mobile_number = models.CharField(
        max_length=244, null=True, blank=True)
    city = models.ForeignKey(
        City, null=True, blank=True, related_name='city', on_delete=None)
    state = models.ForeignKey(
        State, null=True, blank=True, related_name='state',on_delete=None)
    country = models.ForeignKey(
        Country, null=True, blank=True, related_name='country', on_delete=None)
    username = models.SlugField(max_length=254, unique=True, blank=True)
    is_staff = models.BooleanField('Staff member', default=False)
    is_active = models.BooleanField('Active', default=False)
    is_superuser = models.BooleanField('Is a Super user', default=False)
    create_date = models.DateTimeField('Joined Time', auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)
    is_app_user = models.BooleanField('App User', default=False)
    country_code = models.CharField(max_length=100, null=True, blank=True)
    objects = UserManager()

    def get_full_name(self):
        return '{0}'.format(self.first_name)

    def __str__(self):
        return '{0}'.format(self.first_name)

    def get_short_name(self):
        return '{0}'.format(self.first_name, )

    @staticmethod
    def create_username(email=None, first_name=None, seperator='-'):
        ''' Create Username '''
        username = None
        lenslug = 210
        if email:
            username = email
        # elif first_name:
        #     username = first_name
        # if not len(username) > 210:
        #     lenslug = len(username)
        # username = slugify(username)[0:lenslug]
        # temp_username = username
        # for itrvalue in itertools.count(1):
        #     if not User.objects.filter(username=username).exists():
        #         break
        #     username = "%s%s%d" % (slugify(temp_username), seperator, itrvalue)
        return username

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        '''
        Save Model
        '''
        if not self.username:
            self.username = User.create_username(self.email, self.first_name)
        return super(User, self).save(force_insert=False,
                                      force_update=False,
                                      using=None,
                                      update_fields=None)

    USERNAME_FIELD = 'email'

    class Meta:
        ''' User Class Meta '''
        verbose_name = 'User'
        verbose_name_plural = 'Users'
        db_table = 'User'
        app_label = 'accounts'



