#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django.db import models
from datetime import datetime, timedelta

from django.db import models

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.core.mail import send_mail
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.core import validators

from django.conf import settings
import os

class FuncionarioManager(BaseUserManager):
	
	def create_user(self, username, matricula, email, horario_inicial_entrada, horario_final_saida,  password=None, **extra_fields):
		"""
		Creates and saves an EmailUser with the given email and password.
		"""
		now = timezone.now()
		if not email:
			raise ValueError('The given email must be set')
		
		funcionario = FuncionarioManager.normalize_email(email)
		user = self.model(username=username, matricula=matricula, email=email,  horario_inicial_entrada=horario_inicial_entrada, horario_final_saida=horario_final_saida, is_staff=False, is_active=True, is_superuser=False, last_login=now, date_joined=now, **extra_fields)

		user.set_password(password)
		user.save(using=self._db)
		return user

	def create_superuser(self, username, matricula, email, horario_inicial_entrada, horario_final_saida,  password, **extra_fields):
		"""
		Creates and saves a superuser with the given email and password.
		"""
		user = self.create_user(username, matricula, email, horario_inicial_entrada, horario_final_saida, password, **extra_fields)
		user.is_admin = True
		user.is_staff = True
		user.is_active = True
		user.is_superuser = True
		user.save(using=self._db)
		return user


class AbstractFuncionario(AbstractBaseUser, PermissionsMixin):
	"""
	Abstract User with the same behaviour as Django's default User but
	without a username field. Uses email as the USERNAME_FIELD for
	authentication.

	Use this if you need to extend EmailUser.

	Inherits from both the AbstractBaseUser and PermissionMixin.

	The following attributes are inherited from the superclasses:
	* password
	* last_login
	* is_superuser
	"""
	
	username = models.CharField(_('username'), max_length=30, unique=True, help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'), validators=[validators.RegexValidator(r'^[\w.@+-]+$', _('Enter a valid username.'), 'invalid')])
	first_name = models.CharField(_('first name'), max_length=30, blank=True)
	last_name = models.CharField(_('last name'), max_length=30, blank=True)
	matricula = models.CharField(verbose_name="Matrícula", max_length=20, help_text="Matrícula do funcionário.", blank=False, null=False, unique=True)
	
	horario_inicial_entrada = models.TimeField(verbose_name="Horário Inicial de Entrada", max_length=20, help_text="Este é o horário inicial que começam a contar as horas trabalhadas do funcionário.", blank=False, null=False)
	horario_final_saida = models.TimeField(verbose_name="Horário Final de Saída", max_length=20, help_text="Este é o horário final encerra a contagenm das horas trabalhadas do funcionário.", blank=False, null=False)
	
	email = models.EmailField(_('email address'), max_length=255, unique=True, db_index=True)
	is_staff = models.BooleanField(_('staff status'), default=False,
	help_text=_('Designates whether the user can log into this admin site.'))
	is_active = models.BooleanField(_('active'), default=True,
	help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.'))
	date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

	USERNAME_FIELD = 'username'
	REQUIRED_FIELDS = ['matricula']

	class Meta:
		abstract = True
		verbose_name = 'Funcionário'
		verbose_name_plural = 'Funcionários'

	def get_full_name(self):
		"""
		Returns the first_name plus the last_name, with a space in between.
		"""
		full_name = '%s %s' % (self.first_name, self.last_name)
		return full_name.strip()

	def get_short_name(self):
		"Returns the short name for the user."
		return self.first_name
		

	def email_user(self, subject, message, from_email=None, **kwargs):
		"""
		Sends an email to this User.
		"""
		send_mail(subject, message, from_email, [self.email], **kwargs)


	def __unicode__(self):
		return "%s %s" %(self.first_name, self.last_name)
		
	
class Funcionario(AbstractFuncionario):
	"""
	Concrete class of AbstractEmailUser.

	Use this if you don't need to extend EmailUser.
	"""
	
	objects = FuncionarioManager()
	
	class Meta(AbstractBaseUser.Meta):
		swappable = 'AUTH_USER_MODEL'
		
		
class BatidaPonto(models.Model):
	funcionario = models.ForeignKey(Funcionario, verbose_name="Funcionário", help_text="Funcionário a quem esta batida de ponto se refere.",  blank=False, null=False)
	momento_batidaponto = models.DateTimeField(verbose_name="Momento da Batida de Ponto", help_text="Data e hora de quando o ponto foi batido.", blank=False, null=False, unique=True)

	
	def __unicode__(self):
		return unicode(self.momento_batidaponto)
		
	class Meta:
		verbose_name = "Batida de Ponto"
		verbose_name_plural = "Batidas de Ponto"
		
		unique_together = ('funcionario', 'momento_batidaponto')
		
	def momento_batidaponto_formatado(self):
		
		meses  = ("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
		
		dia_formatado = "%d" %(self.momento_batidaponto.day)
		
		if self.momento_batidaponto.day < 10:
			dia_formatado = "0%d" %(self.momento_batidaponto.day)
			
		horas_formatadas = ""
		minutos_formatados = ""
		segundos_formatados = ""
				
		
		if self.momento_batidaponto.hour < 10:
			horas_formatadas = "0%d" %(self.momento_batidaponto.hour)
		else:
			horas_formatadas = str(self.momento_batidaponto.hour)
		
		if self.momento_batidaponto.minute < 10:
			minutos_formatados = "0%d" %(self.momento_batidaponto.minute)
		else:
			minutos_formatados = str(self.momento_batidaponto.minute)
			
		if self.momento_batidaponto.second < 10:
			segundos_formatados = "0%d" %(self.momento_batidaponto.second)
		else:
			segundos_formatados = str(self.momento_batidaponto.second)
	
		semana = "%s de %s de %d, às %s:%s:%s" %(dia_formatado, meses[self.momento_batidaponto.month -1], self.momento_batidaponto.year, horas_formatadas, minutos_formatados, segundos_formatados)
		
		return semana

class Sincronizacao(models.Model):
	data_hora = models.DateTimeField(verbose_name="Momento da Última Sincronização", help_text="Data e hora de quando a última sincronização foi realizada.", blank=False, null=False)

	def __unicode__(self):
		return unicode(self.data_hora)
		
	class Meta:
		verbose_name = "Sincronização"
		verbose_name_plural = "Sincronizações"
		
	
from django.utils.safestring import mark_safe	
	
class Comentario(models.Model):
	funcionario = models.ForeignKey(Funcionario, verbose_name="Funcionário", help_text="Funcionário a quem esta batida de ponto se refere.",  blank=False, null=False)
	data = models.DateField(verbose_name="Data", help_text="Data do comentário.",  blank=False, null=False)
	texto = models.TextField(verbose_name="Texto do Comentário", help_text="Data do comentário.", max_length="500", blank=False, null=False)
	arquivo_anexo = models.FileField(verbose_name="Arquivo anexo", help_text="Arquivo anexo para avaliação da chefia.", max_length="500", blank=True, null=True, upload_to="arquivos_anexos")
	
	avaliado_pela_chefia = models.BooleanField(verbose_name="Avaliado pela chefia.", help_text="Avaliado pela chefia.", default=False)
	aprovado = models.BooleanField(verbose_name="Aprovado pela chefia.", help_text="Aprovado pela chefia.", default=False)
	
	tempo_gasto = models.TimeField(verbose_name="Tempo gasto ou relacionado", help_text="Tempo gasto ou relacionado ao comentário.", blank=False, null=False)
	
	def __unicode__(self):
		return unicode(self.data)
		
	class Meta:
		verbose_name = "Comentário"
		verbose_name_plural = "Comentários"
		
	def link_arquivo_anexo(self):
		
		if self.arquivo_anexo:	
			nome_arquivo = str(self.arquivo_anexo).split("/")[-1]
			return mark_safe("<a href=\"%s\"> %s <a/>" %(self.arquivo_anexo, nome_arquivo))
		else:
			return "Nenhum arquivo em anexo."
			
	def data_texto(self):

		return self.data.strftime("%d/%m/%Y")
		
	def situacao(self):
		
		if self.aprovado:
			
			return "Aprovado"
		
		elif self.avaliado_pela_chefia:
			
			return "Rejeitado"
			
		else:
			
			return "Aguardando avaliação"
			
		

class Observacao(models.Model):
	data = models.DateField(verbose_name="Data", help_text="Data da observação.",  blank=False, null=False)
	texto = models.TextField(verbose_name="Texto da Observação", help_text="Digite a observação desta data para todos os funcionários.", max_length="500", blank=False, null=False)
	
	def __unicode__(self):
		return unicode(self.data)
		
	class Meta:
		verbose_name = "Observação"
		verbose_name_plural = "Observações"
