import datetime
import threading
from time import sleep
from django.contrib import messages
from django.db.models import Sum
from django.http import HttpResponse, HttpResponseRedirect
import json
import requests
from django.shortcuts import render
from Biometrico.models import Empleados, Marcaciones, Departamento, Permisos, Contrato
from TransitoApp.snnipers import render_to_pdf


# Create your views here

def token_act():
    url = "http://10.20.50.60/jwt-api-token-auth/"
    headers = {
        "Content-Type": "application/json",
    }
    data = {
        "username": "admin",
        "password": "Johnny1987*"
    }
    response = requests.post(url, data=json.dumps(data), headers=headers)
    token = response.json()["token"]
    return token


def returnEmpleados(pagina=1):
    url = f"http://10.20.50.60/personnel/api/employees/?page={pagina}"
    headers = {
        "Content-Type": "application/json",
        'Authorization': "JWT " + token_act(),
    }
    response = requests.get(url, headers=headers)
    contador = int(response.json()['count'])
    dt = int(contador / 10)
    return {"data": response.json()['data'], 'pages': dt}


def recursivo():
    url = 'http://10.20.50.60/iclock/api/transactions/?start_time = %s-%s-%s' % (
    datetime.datetime.today().year, datetime.datetime.today().month, datetime.datetime.today().day)
    headers = {
        "Content-Type": "application/json",
        'Authorization': "JWT " + token_act(),
    }
    response = requests.get(url, headers=headers)
    for marcacion in response.json()['data']:
        try:
            emp = Empleados.objects.get(id_biometrico=marcacion['emp'])
            horas=datetime.datetime.strptime(marcacion['punch_time'],"%Y-%m-%d %H:%M:%S")

            Marcaciones.objects.create(
                id_marcacion=marcacion['id'],
                empleado_id=emp.id,
                hora_marcacion=horas,
                hora = horas.time(),
                fecha = horas.date(),
            )
            print("Registro..!")
        except Exception as error:
            pass
        print('finalizo...!')
    print('consulta a:', url, datetime.datetime.today().time())
    sleep(5)
    marcas = threading.Thread(target=recursivo)
    marcas.start()


def returnMarcaciones(pagina=1):
    url = f'http://10.20.50.60/iclock/api/transactions/?page={pagina}&page_size=10000'
    headers = {
        "Content-Type": "application/json",
        'Authorization': "JWT " + token_act(),
    }
    response = requests.get(url, headers=headers)
    contador = int(response.json()['count'])
    dt = int(contador / 10)
    return {"data": response.json()['data'], 'pages': dt}


def empleados(request):
    paginas = returnEmpleados()['pages']
    for pagina in range(0, paginas + 1):
        for emp in returnEmpleados(pagina)['data']:
            try:
                Empleados.objects.create(
                    id_biometrico=emp['id'],
                    codigo=emp['emp_code'],
                    nombres=emp['first_name'],
                    apellidos=emp['last_name'],
                    departamento_id=emp['department']['id'],
                )
                print('se ha creado', emp['first_name'])
            except:
                print('Ya esta registrado', emp['first_name'])
    if request.POST:
        empleado = Empleados.objects.get(id=request.GET.get('id'))
        empleado.codigo = request.POST.get('cedula')
        empleado.apellidos = request.POST.get('apellidos')
        empleado.nombres = request.POST.get('nombres')
        if request.POST.get('estado') == 'A':
            empleado.estado = True
        else:
            empleado.estado = False
        empleado.departamento_id = request.POST.get('departamento')
        empleado.save()
        messages.add_message(request, messages.SUCCESS, "Los cambios se registraron")
    contexto = {
        'empleados': Empleados.objects.all().order_by('-estado'),
        'departamentos': Departamento.objects.all()
    }
    return render(request, 'biometrico/empleados.html', contexto)


# solicitar marcaciones:
def marca():
    paginas = returnMarcaciones()['pages']
    for pagina in range(0, paginas + 1):
        print("pagina No.", pagina)
        for marcacion in returnMarcaciones(pagina)['data']:
            horas = datetime.datetime.strptime(marcacion['punch_time'], "%Y-%m-%d %H:%M:%S")
            try:
                emp = Empleados.objects.get(id_biometrico=marcacion['emp'])
                Marcaciones.objects.create(
                    id_marcacion=marcacion['id'],
                    empleado_id=emp.id,
                    hora_marcacion=horas,
                    hora=horas.time(),
                    fecha=horas.date(),
                )
            except Exception as error:
                print(error)
    print('finalizo...!')


def marcaciones_(request):
    marcas = threading.Thread(target=marca)
    marcas.start()
    return HttpResponseRedirect('/biometrico/marcaciones')


def marcaciones(request):
    tiempo = datetime.datetime.today().date()
    contexto = {
        'marcaciones': Marcaciones.objects.filter(hora_marcacion__gte=tiempo, empleado__estado=True).order_by(
            'empleado__departamento_id','empleado', 'hora_marcacion')
    }
    return render(request, 'biometrico/marcaciones.html', contexto)


def permisos(request):
    per = Permisos.objects.all()
    if request.GET.get('emp'):
        per = per.filter(empleado_id=request.GET.get('emp'))
    if request.GET.get('a'):
        per = per.filter(fecha__year=request.GET.get('a'))
    if request.GET.get('m'):
        per = per.filter(fecha__month=request.GET.get('m'))
    if request.GET.get('f'):
        per = per.filter(empleado_id=request.GET.get('f'))
    if request.GET.get('j'):
        j = False
        if request.GET.get('j') == "Si":
            j = True
        per = per.filter(justificable=j)
    if request.POST:
        j = "N"
        if request.POST.get('justificable') == "S":
            j = True
        else:
            j = False
        permiso = None
        if request.GET.get('id'):
            permiso = Permisos.objects.get(id=request.GET.get('id'))
        else:
            permiso = Permisos()
        permiso.empleado_id = request.POST.get('empleado')
        permiso.justificable = j
        permiso.fecha = request.POST.get('fecha_solicitud')
        permiso.fecha_salida = request.POST.get('fecha_salida')
        permiso.hora_salida = request.POST.get('hora_salida')
        permiso.detalle_permiso = request.POST.get('detalle')
        permiso.save()
        messages.add_message(request, messages.SUCCESS, "El permiso se ha registrado.!")
        return HttpResponseRedirect("/biometrico/permisos")
    contexto = {
        'permisos': per,
        'empleados': Empleados.objects.filter(estado=True).order_by('nombres'),
        'anios': [a for a in range(2023, datetime.datetime.now().year + 1)],
        'meses': [m for m in range(1, 13)],
    }
    return render(request, 'biometrico/permisos.html', contexto)


def resumen(request):
    tiempo = datetime.datetime.today().date()
    contexto = {
        'marcaciones': Marcaciones.objects.filter(hora_marcacion__gte=tiempo, empleado__estado=True),
        'usuarios': Empleados.objects.filter(estado=True),
        'departamentos': Departamento.objects.all().exclude(nombre='Otro'),
    }
    return render(request, 'biometrico/index.html', contexto)


def marcaciones_dia(request):
    tiempo = datetime.datetime.today().date()
    marcaciones = Marcaciones.objects.filter(hora_marcacion__gte=tiempo, empleado__estado=True)
    lista = []
    for i in marcaciones:
        lista.append({
            'hora': i.hora.strftime('%I:%M %p'),
            'empleado': str(i.empleado.nombres) + " " + str(i.empleado.apellidos)
        })
    return HttpResponse(json.dumps(lista))




def reporte_atrasos(request):
    funcionario=None
    tiempo = datetime.datetime.today().date()
    marcc = Marcaciones.objects.filter(hora_marcacion__gte=tiempo, empleado__estado=True)
    if request.GET.get('f1') and request.GET.get('f2'):
        marcc = Marcaciones.objects.filter(fecha__range=[request.GET.get('f1'),request.GET.get('f2')]).exclude(retraso="0:00:00").exclude(retraso=None) | Marcaciones.objects.filter(fecha__range=[request.GET.get('f1'),request.GET.get('f2')], hora="00:00:00")
        marcc = marcc.filter(hora__range=["00:00:00", "12:00:00"], empleado__estado=True)
    if request.GET.get('fun'):
        marcc=marcc.filter(empleado_id=request.GET.get('fun'))
        funcionario=Empleados.objects.get(id=request.GET.get('fun'))
    if request.POST:
        c=marcc.get(id=request.GET.get('e'))
        c.justificado= request.POST.get('ju') == 'Si'
        c.feriado = request.POST.get('df') == 'Si'
        c.detalle_marcacion=request.POST.get('d')
        c.save()
        messages.add_message(request,messages.SUCCESS,"Se registró una justificación")
        return HttpResponseRedirect(f"/biometrico/rep_atrasos?f1={request.GET.get('f1')}&f2={request.GET.get('f2')}")

    contexto = {
        'marcaciones': marcc.order_by('fecha'),
        'justificados':marcc.filter(justificado=True).count(),
        'f1':request.GET.get('f1'),
        'f2':request.GET.get('f2'),
        'fun':request.GET.get('fun'),
        'empleados': Empleados.objects.filter(estado=True).count(),
        'fecha':datetime.datetime.now(),
        'funcionario':funcionario,
    }

    if request.GET.get('imp'):
        return render_to_pdf('biometrico/informe_general_atrasos.html', contexto)
    return render(request, 'biometrico/reporte_atrasos.html', contexto)


def reporteMarcaciones(request):
    marcaciones = None
    mes = datetime.datetime(year=datetime.datetime.today().year, month=datetime.datetime.today().month, day=1)
    marcaciones = Marcaciones.objects.filter(fecha__range=[mes, datetime.datetime.today()],
                                                 empleado__estado=True).order_by('hora_marcacion')
    if request.GET.get('f1') and request.GET.get('f2'):
        f1 = request.GET.get('f1')
        f2 = request.GET.get('f2')
        marcaciones = Marcaciones.objects.filter(fecha__range=[f1, f2], empleado__estado=True).order_by('hora_marcacion')
        if request.GET.get('funcionario'):
            marcaciones = marcaciones.filter(empleado_id=request.GET.get('funcionario'))


    contexto = {
        'marcaciones': marcaciones,
        'areas': Departamento.objects.all(),
        'funcionarios': Empleados.objects.filter(estado=True),
    }
    return render(request, 'biometrico/reporteMarcaciones.html', contexto)

def contrato(request):
    if request.POST:
        Contrato.objects.create(
            fecha_inicio=request.POST.get('fecha_inicio'),
            fecha_fin=request.POST.get('fecha_fin'),
            empleado_id=request.GET.get('n'),
            cargo=request.POST.get('cargo'),
            partida_presupuestaria=request.POST.get('partida_presupuestaria'),
            certificacion_numero=request.POST.get('certificacion_numero'),
        )
    contexto={
        'contratos':Contrato.objects.filter(empleado_id=request.GET.get('n')),
        'empleado':Empleados.objects.get(id=request.GET.get('n')),
    }
    if request.GET.get('print'):
        contexto={
            'contrato':Contrato.objects.get(id=request.GET.get('print'))
        }
        return render_to_pdf('biometrico/contrato.html',contexto)
    return render(request, 'biometrico/todos_contratos.html',contexto)

#marcas = threading.Thread(target=recursivo)
#marcas.start()
# Marcaciones.objects.all().delete()
