import random, datetime, os
from datetime import datetime, timedelta

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import ContentType
from django.contrib.auth.models import User, Group, Permission

from sbhs_server import settings
# from django.conf import settings

MOD_GROUP_NAME = 'moderator'


def create_group(group_name, app_label):
    try:
        group = Group.objects.get(name=group_name)
    except Group.DoesNotExist:
        group = Group(name=group_name)
        group.save()
        # Get the models for the given app
        content_types = ContentType.objects.filter(app_label=app_label)
        permission_list = Permission.objects.filter(
            content_type__in=content_types
        )
        group.permissions.add(*permission_list)
        group.save()
    return group

class Board(models.Model):
    """ SBHS Board attributes"""

    mid = models.IntegerField(unique=True)
    online = models.BooleanField(default=False)
    usb_id = models.IntegerField(default="0")
    raspi_path = models.URLField(max_length=200, default="localhost:8000")

    def save_board_details(self, raspi_ip, device):
            board = Board.objects.filter(mid=device["sbhs_mac_id"])
            if board.exists():
                board = board.first()
            else:
                board = self
                board.mid = device["sbhs_mac_id"]
            board.raspi_path = raspi_ip
            board.usb_id = int(device["usb_id"])
            board.online = True
            board.save()

    def switch_off_inactive_boards(self, online_mids):
        all_boards = Board.objects.all()
        for board in all_boards:
            if board.mid not in online_mids: 
                board.online = False
            elif board.mid in online_mids:
                board.online = True
            board.save()

    class Meta:
        ordering = ['mid',]

    def __str__(self):
        return 'MID: {0} Online: {1}: User Count: {2}'.format(
                                    self.mid,
                                    self.online,
                                    self.userboard_set.all().count()
                                    )

class Profile(models.Model):
    """
    Profile model to store user details.
    """
    user = models.OneToOneField(User)
    roll_number = models.CharField(max_length=20)
    institute = models.CharField(max_length=128)
    department = models.CharField(max_length=64)
    position = models.CharField(max_length=64)
    is_moderator = models.BooleanField(default=False)
    is_email_verified = models.BooleanField(default=False)
    activation_key = models.CharField(max_length=255,blank=True,null=True)
    key_expiry_time = models.DateTimeField(blank=True,null=True)

    def _toggle_moderator_group(self, group_name):
        group = Group.objects.get(name=group_name)
        if self.is_moderator:
            self.user.groups.add(group)
        else:
            self.user.groups.remove(group)

    def save(self, *args, **kwargs):
        if self.pk is not None:
            old_profile = Profile.objects.get(pk=self.pk)
            if old_profile.is_moderator != self.is_moderator:
                self._toggle_moderator_group(group_name=MOD_GROUP_NAME)
        super(Profile, self).save(*args, **kwargs)

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


class SlotManager(models.Manager):

    def get_user_slots(self, user):
        now = timezone.localtime()
        slots = self.filter(user=user, start_time__lte=now, end_time__gt=now)
        return slots

    def get_all_active_slots(self):
        now = timezone.localtime()
        slots = self.filter(start_time__lte=now, end_time__gt=now)
        return slots

    def check_booked_slots(self, start_time, users):
        return self.filter(start_time__lte=start_time,
                           end_time__gt = start_time,
                           user__in=users
                           ).count() == 0
    def get_active_slot_for_board(self, mid):
        now = timezone.localtime()
        users = [userboard.user.id for userboard in
                 UserBoard.objects.filter(board__mid=mid)
                 ]
        slots = self.filter(user__in=users, start_time__lte=now,
                            end_time__gt=now)
        return slots

    def board_all_booked_slots(self,mid):
        now = timezone.localtime()
        users = [userboard.user.id for userboard in UserBoard.objects.filter(
                 board__mid=mid)
                ]
        slots = self.filter(user__in=users,start_time__gte=now)
        return slots

class Slot(models.Model):
    user = models.ForeignKey(User)
    start_time = models.DateTimeField("Start time of a slot",
                                      default=timezone.now())
    end_time = models.DateTimeField("End time of a slot",
                default=timezone.now()+timedelta(
                    minutes=settings.SLOT_DURATION))

    objects = SlotManager()

    def __str__(self):
        return '{} {}'.format(self.start_time, self.end_time)


class Experiment(models.Model):
    slot = models.ForeignKey("Slot")
    log = models.CharField(max_length=255)
    checksum = models.CharField(max_length=255, null=True, blank=True)

    def __str__(self):
        return '{0}: {1}'.format(self.slot.user, self.slot)


class UserBoard(models.Model):
    user = models.ForeignKey(User)
    board = models.ForeignKey(Board)

    def get_all_users_for_board(self):
        now = timezone.now()
        users = UserBoard.objects.filter(board=self.board)
        return users

    def __str__(self):
        return '{0}: {1}'.format(self.user.username, self.board.mid)

class Webcam():

    def __init__(self):
        pass

    def load_image(className,mid):
        command = "timeout 2s streamer -q -f jpeg -c /dev/video" + '0'+str(mid)
        command += " -o " + settings.WEBCAM_DIR + "image" + '0'+str(mid) + ".jpeg"
        os.system(command)