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

from django.shortcuts import render, redirect, render_to_response
from django.template import RequestContext
from django.http import HttpResponse
from django.db import IntegrityError

from django.contrib.auth.decorators import login_required

from models	import *
from utils import *

import os

from django.core.exceptions import ObjectDoesNotExist

from django.contrib.auth import authenticate, login, logout

from datetime import datetime, date
import time

from django.conf import settings

def pagina_inicial(request):
	
	lista_funcionarios = list(Funcionario.objects.all().exclude(username='admin'))
	lista_funcionarios.sort()
	
	admin_autenticado = request.user.is_superuser
	
	status_autenticacao = None
		
	if 'status_autenticacao' in request.session:
			status_autenticacao = request.session['status_autenticacao']
	
	if admin_autenticado:

		nome_funcionario = None
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
		else:
			try:
				nome_funcionario = lista_funcionarios[0].username
				request.session['nome_funcionario'] = nome_funcionario
			except Exception:
				pass
		
		for funcionario in lista_funcionarios:
			if funcionario.username == nome_funcionario:
				funcionario.selecionado = True

	return render_to_response('pagina_inicial.html', locals(), context_instance=RequestContext(request))

def autenticar(request):
		
	funcionario = None
	nome_usuario = None
	senha = None
	
	origem = "/"
	
	if 'HTTP_REFERER' in request.META and request.META['HTTP_REFERER']:
		origem = request.META['HTTP_REFERER']
	
	if 'nome_usuario' in request.POST and request.POST['nome_usuario']:
		nome_usuario = request.POST['nome_usuario']
		
	if 'senha' in request.POST and request.POST['senha']:
		senha = request.POST['senha']
		
		
	if nome_usuario and senha:
		funcionario = authenticate(username=nome_usuario, password=senha)

	if funcionario is not None:
		if funcionario.is_active:
			login(request, funcionario)
			request.session['status_autenticacao'] = None

		else:
			request.session['status_autenticacao'] = "Usuário Desabilitado"
			# Return a 'disabled account' error message
	else:
		request.session['status_autenticacao'] = "Usuário Inválido"
		# Return an 'invalid login' error message.
		
	return redirect(origem, permanent=False)
	
	# Página inicial que redireciona para o Django Admin.
	

def sair(request):
	logout(request)
	return redirect('pagina_inicial', permanent=False)
	
@login_required(login_url='/')
def batidasponto(request):
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
			funcionario = Funcionario.objects.get(username=nome_funcionario)
	
	else:
	
		funcionario = request.user
			
	batidasponto = []
	
	if not funcionario.is_anonymous():
		batidasponto = list(BatidaPonto.objects.filter(funcionario=funcionario))
		batidasponto.reverse()
		
	dias_semana = ["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira", "Sexta-feira","Sábado","Domingo"]
	
	for bp in batidasponto:
		bp.dia_semana = dias_semana[bp.momento_batidaponto.weekday()]
	
		
	return render_to_response('batidasponto.html', locals(), context_instance=RequestContext(request))

@login_required(login_url='/')
def resumodiario(request):
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
			funcionario = Funcionario.objects.get(username=nome_funcionario)
	
	else:
	
		funcionario = request.user
	
	datas_horastrabalhadas = []

	if not funcionario.is_anonymous():
		datas_horastrabalhadas = horas_trabalhadas_dia(funcionario)
		
	datas_horastrabalhadas.reverse()
	
	
	dias_semana = ["Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira", "Sexta-feira","Sábado","Domingo"]
	
	for dht in datas_horastrabalhadas:
		dht.dia_semana = dias_semana[dht.data.weekday()]
	
	for dht in datas_horastrabalhadas:
		comentario = None
		try:
			comentario = Comentario.objects.get(funcionario=funcionario, data=dht.data)
		except ObjectDoesNotExist:
			pass
		if comentario:
			dht.comentario = comentario
			
	for dht in datas_horastrabalhadas:
		observacao = None
		try:
			observacao = Observacao.objects.get(data=dht.data)
		except ObjectDoesNotExist:
			pass
		
		if observacao:
			dht.observacao = observacao
		
	return render_to_response('resumodiario.html', locals(), context_instance=RequestContext(request))
	
	
	
	

@login_required(login_url='/')
def resumosemanal(request):
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
			funcionario = Funcionario.objects.get(username=nome_funcionario)
	
	else:
	
		funcionario = request.user
	
	semanas_horastrabalhadas = []
	
	if not funcionario.is_anonymous():
		semanas_horastrabalhadas = horas_trabalhadas_semana(funcionario)
	
	semanas_horastrabalhadas.reverse()
	
	return render_to_response('resumosemanal.html', locals(), context_instance=RequestContext(request))
	

def forcar_sincronizacao(request):
	if sincronizar():
		return HttpResponse("Os dados foram sincronizados com sucesso.")
	else:
		return HttpResponse("Não há funcionários cadastrados.")	
	
	
# Relatórios

@login_required(login_url='/')
def relatorio_individual(request, funcionario=None, mes=None, ano=None):
	
	admin_autenticado = request.user.is_superuser
	
	if not admin_autenticado:
		
		mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
		destino = "/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
			
	if 'funcionario' in request.POST and request.POST['funcionario']:	
	
			
			funcionario = request.POST['funcionario']
			
			if 'mes' in request.POST and request.POST['mes']:
				mes = request.POST['mes']
		
			if 'ano' in request.POST and request.POST['ano']:
				ano = request.POST['ano']
				
			
			return redirect("/relatorio_individual/%s/%s/%s/" %(funcionario, mes, ano), permanent=False)
	
	else:
		
		if not funcionario:
			
			# Exibe a tela que gera os relatórios.
					
			anos = range(2010,2014+1,1)
			anos.reverse()

			lista_funcionarios = list(Funcionario.objects.all().exclude(username='admin'))
			lista_funcionarios.sort()
					
			return render_to_response('relatorios/tela_geracao_relatorio_individual.html', locals(), context_instance=RequestContext(request))	
		
		else:
			
			# Gera o relatório.
			
			relatorios_diarios = []
			
			try:
				funcionario = Funcionario.objects.get(username=funcionario)
			except ObjectDoesNotExist:
				pass
				
			mes = int(mes)
			ano = int(ano)
				
			dias_semana_abreviados = ["Seg","Ter","Qua","Qui", "Sex","Sáb","Dom"]
			meses  = ("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
						
			relatorios_diarios = gerar_relatorio_mensal(funcionario, mes, ano)
			
			mes_texto = meses[mes-1]
			
			
			# Para inverter a matrícula, descomentar a linha abaixo.
			
			funcionario.matricula = funcionario.matricula[::-1]
					
			
			for rel in relatorios_diarios:
				rel.ultimo_dia_mes = False
				
			if relatorios_diarios:
				relatorios_diarios[-1].ultimo_dia_mes = True

			ultima_data = None
			primeira_semana = True

			for rel in relatorios_diarios:	
					
				data_objeto = datetime.strptime(rel.data, "%d/%m/%Y")
				rel.dia_semana = dias_semana_abreviados[data_objeto.weekday()]
				
				datas = []
				
				if data_objeto.weekday() == 5:
					rel.sabado = True	
					
					if primeira_semana:
						primeiro_dia_mes = datetime.strptime(relatorios_diarios[0].data, "%d/%m/%Y")
						dia_temp = primeiro_dia_mes
						while dia_temp <= data_objeto:
							datas.append(dia_temp)
							dia_temp += timedelta(days=1)
						primeira_semana = False		
						
					else:
						for i in range(7):
							datas.append(data_objeto - timedelta(days=i))
					
					rel.horas_ate_este_sabado = horas_trabalhadas_datas(funcionario, datas)
					
				elif rel.ultimo_dia_mes:
					
					data_objeto = datetime.strptime(rel.data, "%d/%m/%Y")
					
					while(data_objeto.weekday() != 5):
						datas.append(data_objeto)
						data_objeto -= timedelta(days=1)
					
					rel.horas_ate_este_sabado = horas_trabalhadas_datas(funcionario, datas)
					
					return render_to_response('relatorios/relatorio_individual.html', locals(), context_instance=RequestContext(request))	
	

@login_required(login_url='/')
def relatorio_geral(request,  mes=None, ano=None):
	
	admin_autenticado = request.user.is_superuser
	
	if not admin_autenticado:
		
		mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
		destino = "/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
		
	
	if 'mes' in request.POST and request.POST['mes'] and  'ano' in request.POST and request.POST['ano']:
		
		mes = request.POST['mes']	
		ano = request.POST['ano']
		
		return redirect("/relatorio_geral/%s/%s/" %(mes, ano), permanent=False)
		
	
	else:
		
		if not mes and not ano:
			
			# Exibe a tela de geração de relatório
			
			anos = range(2010,2014+1,1)
			anos.reverse()
			
			return render_to_response('relatorios/tela_geracao_relatorio_geral.html', locals(), context_instance=RequestContext(request))

		else:
			
			# Finalmente, gera o relatório
			
			mes = int(mes)
			ano = int(ano)
			
			meses  = ("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")
						
			mes_texto = meses[mes-1]
	
			funcionarios = list(Funcionario.objects.all())
			admin = Funcionario.objects.get(username='admin')
						
			funcionarios.remove(admin)

			for funcionario in funcionarios:
				
				funcionario.semanas_horastrabalhadas = horas_trabalhadas_semana_durante_mes(funcionario, int(mes), int(ano))
				
				for sht in funcionario.semanas_horastrabalhadas:
					
					print sht.semana_formatada()
	
			return render_to_response('relatorios/relatorio_geral.html', locals(), context_instance=RequestContext(request))


















# Comentários
@login_required(login_url='/')	
def adicionar_comentario(request, dia=None, mes=None, ano=None):
	
	data = date(day=int(dia), month=int(mes), year=int(ano))
	data_texto = data.strftime("%d/%m/%Y")
	
	funcionario = request.user
		
	if 'data_texto' in request.POST and 'comentario' in request.POST and 'tempo_gasto' in request.POST:
		
		if request.POST['data_texto'] and request.POST['comentario'] and request.POST['tempo_gasto']:
				
			funcionario = request.user

			data_texto = request.POST['data_texto']
			data = datetime.strptime(data_texto, "%d/%m/%Y")
			
			texto_comentario = request.POST['comentario']
			
			tempo_gasto = request.POST['tempo_gasto']
			
			comentario = Comentario()
			comentario.funcionario = funcionario
			comentario.data = data.date()
			comentario.texto = texto_comentario
			
			if 'arquivo_anexo' in request.FILES:
				arquivo_anexo = request.FILES['arquivo_anexo']
				
				extensao = arquivo_anexo.name.split(".")[-1]
				
				nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
				
				if not os.path.exists(os.path.dirname(nome_arquivo)):
					os.makedirs(os.path.dirname(nome_arquivo))
				
				destino = open(nome_arquivo, 'wb+')
						
				for chunk in arquivo_anexo.chunks(): 
					destino.write(chunk)
					
				destino.close()
				
				comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
			
			try:
				teste_formato = time.strptime(tempo_gasto, '%H:%M:%S')
				comentario.tempo_gasto = tempo_gasto
				comentario.save()
				
				return redirect('/listar_comentarios/', permanent=False)
				
			except ValueError:
				
				mensagem_erro = "Digite o tempo gasto no formato <hh:mm:ss>. Exemplo: 03:00:00."
				destino = "/adicionar_comentario/%s/" %data_texto
					
				return render_to_response('erro.html', locals(), context_instance=RequestContext(request))	
					
	return render_to_response('comentarios/adicionar_comentario.html', locals(), context_instance=RequestContext(request))
		


@login_required(login_url='/')
def editar_comentario(request, dia=None, mes=None, ano=None):
	
	data = date(day=int(dia), month=int(mes), year=int(ano))
	data_texto = data.strftime("%d/%m/%Y")
	
	admin_autenticado = request.user.is_superuser
	
	if not admin_autenticado:
		
		mensagem_erro = "Acesso negado! Apenas o próprio dono do comentário pode acessar esta função."
		destino = "/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
	
	try:
		
		comentario = Comentario.objects.get(data=data, funcionario=funcionario)
		
		if not comentario.avaliado_pela_chefia:
		
			if 'data_texto' in request.POST and 'comentario' in request.POST and request.POST['data_texto'] and request.POST['comentario']:
		
				data_texto = request.POST['data_texto']
				data = datetime.strptime(data_texto, "%d/%m/%Y")
				
				texto_comentario = request.POST['comentario']
				
				comentario.data = data.date()
				comentario.texto = texto_comentario
				
				if 'arquivo_anexo' in request.FILES:
					arquivo_anexo = request.FILES['arquivo_anexo']
					
					extensao = arquivo_anexo.name.split(".")[-1]
					
					nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
					
					if not os.path.exists(os.path.dirname(nome_arquivo)):
						os.makedirs(os.path.dirname(nome_arquivo))
					
					destino = open(nome_arquivo, 'wb+')
							
					for chunk in arquivo_anexo.chunks(): 
						destino.write(chunk)
						
					destino.close()
					
					comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
					
				comentario.save()
				
				return redirect('/listar_comentarios/', permanent=False)	
			
			else:
				
				return render_to_response('comentarios/editar_comentario.html', locals(), context_instance=RequestContext(request))
		else:
			
			mensagem_erro = "Acesso negado! Este comentário não pode ser mais editado."
			destino = "/"
				
			return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
			
			
	
	except ObjectDoesNotExist:
		
		mensagem_erro = "Não existe comentário para esta data."
		destino = "/listar_comentarios/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
	
	if 'data_texto' in request.POST and 'comentario' in request.POST and request.POST['data_texto'] and request.POST['comentario']:
	
		data_texto = request.POST['data_texto']
		data = datetime.strptime(data_texto, "%d/%m/%Y")
		
		texto_comentario = request.POST['comentario']
		
		comentario.data = data.date()
		comentario.texto = texto_comentario
		
		if 'arquivo_anexo' in request.FILES:
			arquivo_anexo = request.FILES['arquivo_anexo']
			
			extensao = arquivo_anexo.name.split(".")[-1]
			
			nome_arquivo = os.path.join(settings.MEDIA_ROOT, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
			
			if not os.path.exists(os.path.dirname(nome_arquivo)):
				os.makedirs(os.path.dirname(nome_arquivo))
			
			destino = open(nome_arquivo, 'wb+')
					
			for chunk in arquivo_anexo.chunks(): 
				destino.write(chunk)
				
			destino.close()
			
			comentario.arquivo_anexo = os.path.join(settings.MEDIA_URL, 'arquivos_anexos', funcionario.username, "%s.%s" %(data.strftime("%d-%m-%Y"), extensao))
			
		comentario.save()
		
		return redirect('/listar_comentarios/', permanent=False)
		
	else:
		
		return render_to_response('comentarios/editar_comentario.html', locals(), context_instance=RequestContext(request))
	
	
@login_required(login_url='/')
def consultar_comentario(request, dia=None, mes=None, ano=None):
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
			funcionario = Funcionario.objects.get(username=nome_funcionario)
	
	else:
	
		funcionario = request.user
	
	data = date(day=int(dia), month=int(mes), year=int(ano))
	data_texto = data.strftime("%d/%m/%Y")
	
	try:
		comentario = Comentario.objects.get(data=data, funcionario=funcionario)	
		
		return render_to_response('comentarios/consultar_comentario.html', locals(), context_instance=RequestContext(request))

	except ObjectDoesNotExist:
		
		mensagem_erro = "Não existe comentário para esta data."
		destino = "/listar_comentarios/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
		

@login_required(login_url='/')
def remover_comentario(request, dia=None, mes=None, ano=None):
	
	admin_autenticado = request.user.is_superuser
	
	if not admin_autenticado:
		
		mensagem_erro = "Acesso negado! Apenas o próprio dono do comentário pode acessar esta função."
		destino = "/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
	
	funcionario = request.user
	
	data = date(day=int(dia), month=int(mes), year=int(ano))
	data_texto = data.strftime("%d/%m/%Y")
	
	
	try:
		comentario = Comentario.objects.get(data=data, funcionario=funcionario)
		
		if not comentario.avaliado_pela_chefia:
		
			if comentario.arquivo_anexo:
				caminho_arquivo = str(comentario.arquivo_anexo).replace("/media", settings.MEDIA_ROOT)
				os.remove(caminho_arquivo)
				
			if 'remover' in request.POST:	
				if request.POST['remover'] == 'sim':
					comentario.delete()
			
			return redirect('/listar_comentarios/', permanent=False)
			
		else:
			
			mensagem_erro = "Acesso negado! Este comentário não pode ser mais removido."
			destino = "/listar_comentarios/"
					
			return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
		
	except ObjectDoesNotExist:
		
		mensagem_erro = "Não existe comentário para esta data."
		destino = "/listar_comentarios/"
		
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
			
	else:
		
		try:
			comentario = Comentario.objects.get(data=data, funcionario=funcionario)	
			
			return render_to_response('comentarios/remover_comentario.html', locals(), context_instance=RequestContext(request))

		except ObjectDoesNotExist:
			
			mensagem_erro = "Não existe comentário para esta data."
			destino = "/listar_comentarios/"
				
			return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
			

	
@login_required(login_url='/')
def listar_comentarios(request):
	
	comentarios = None
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		if 'nome_funcionario' in request.session and request.session['nome_funcionario']:
			nome_funcionario = request.session['nome_funcionario']
			funcionario = Funcionario.objects.get(username=nome_funcionario)
	
	else:
	
		funcionario = request.user
	
	if not funcionario.is_anonymous():	
		comentarios = Comentario.objects.filter(funcionario=funcionario).order_by('-data')
		
	return render_to_response('comentarios/listar_comentarios.html', locals(), context_instance=RequestContext(request))	
	
	
@login_required(login_url='/')
def selecionar_funcionario(request):
		
	nome_funcionario = None
	
	origem = "/"
	
	if 'nome_funcionario' in request.POST and request.POST['nome_funcionario']:
		nome_funcionario = request.POST['nome_funcionario']
		request.session['nome_funcionario'] = nome_funcionario
		
	return redirect(origem, permanent=False)
	
	# Página inicial que redireciona para o Django Admin.
	
	
@login_required(login_url='/')
def aprovar_comentarios(request):
	
	comentarios = Comentario.objects.filter(avaliado_pela_chefia = False).order_by('-data')
	
	for elemento in request.POST:
		
		if 'comentario_' in elemento:
			
			comentario_id = int(elemento.strip("comentario_"))
			comentario = comentarios.get(id=comentario_id)
			
			if request.POST[elemento] == "sim":
				
				comentario.aprovado = True
				
			elif request.POST[elemento] == "nao":
				
				comentario.aprovado = False
				
			
			comentario.avaliado_pela_chefia = True
			
			comentario.save()
			
		
		
	admin_autenticado = request.user.is_superuser
	
	status_autenticacao = None
		
	if 'status_autenticacao' in request.session:
			status_autenticacao = request.session['status_autenticacao']
	
	if admin_autenticado:
		
		comentarios = Comentario.objects.filter(avaliado_pela_chefia = False).order_by('-data')
		
		return render_to_response('comentarios/aprovar_comentarios.html', locals(), context_instance=RequestContext(request))	
		
	else:
		
		mensagem_erro = "Acesso negado! Apenas o administrador pode acessar esta função."
		destino = "/"
				
		return render_to_response('erro.html', locals(), context_instance=RequestContext(request))
		
	
"""
def observacoes(request):
	
	observacoes = None
	
	admin_autenticado = request.user.is_superuser

	if admin_autenticado:
			
		observacoes = list(Observacao.objects.all())
	
	
		
	return render_to_response('observacoes.html', locals(), context_instance=RequestContext(request))
	
	
def observacao(request):
	
	origem = "/"	
	funcionario = request.user
		
	data_texto = None
	observacao_existente = None
	observacao = None
	
	if 'data' in request.POST and request.POST['data']:
		data_texto = request.POST['data']
	
	if 'observacao' in request.POST and request.POST['observacao']:
		observacao_existente = True
		
	if observacao_existente:
		data = datetime.strptime(data_texto, "%d/%m/%Y")
		observacao = Observacao.objects.get(data=data)
			
	if funcionario.is_superuser:		
		if data_texto:
			return render_to_response('observacao.html', locals(), context_instance=RequestContext(request))
		else:
			return redirect(observacoes, permanent=False)
	else:
			
		return redirect(origem, permanent=False)
"""	

"""
def pagina_inicial2(request):
	
	agora = datetime.now()
	
	try:
		ultima_sincronizacao = Sincronizacao.objects.latest('data_hora')
		
		data_hora_nova_sincronizacao = ultima_sincronizacao.data_hora + timedelta(hours=1)
	
		if data_hora_nova_sincronizacao <= agora:
			sincronizar()
			gerar_resumos_diarios()
			gerar_resumos_semanais()
					
	except ObjectDoesNotExist:
		sincronizar()
		ultima_sincronizacao = Sincronizacao()
		ultima_sincronizacao.data_hora = agora
		ultima_sincronizacao.save()
	
	return redirect('/admin/', permanent=False)
	
"""	
# Página que sincroniza o arquivo de saída do Henry com o banco de dados.	



