import datetime

from django.contrib import messages
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render

from Consultas.models import Placas, PlacaProvisional, Extenos, DuplicadoPlacas, Banco
from Oficios.models import TipoDocumento
from TransitoApp.snnipers import render_to_pdf


# Create your views here.
def consultas(request):
    contexto = {
        'enlace': Extenos.objects.get(id=request.GET.get('id')),
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
    }
    return render(request, 'consultas.html', contexto)


def generador_placas(request):
    if request.POST:
        s1 = str(request.POST.get("s1"))
        s2 = str(request.POST.get("s2"))
        d1 = int(request.POST.get('di'))
        df = int(request.POST.get('df'))
        stri = "%s%s%s" % (s1, str.zfill(str(d1), 3), s2)
        strp = ""
        if request.POST.get('pv'):
            tipo = ""

            for i in range(d1, df + 1):
                try:
                    if len(str(s2)) == 0:
                        strp = "%s%s%s" % (s1, str.zfill(str(i), 4), s2)
                        tipo = "CARRO"
                    else:
                        strp = "%s%s%s" % (s1, str.zfill(str(i), 3), s2)
                        tipo = "MOTO"
                    PlacaProvisional.objects.create(numero=strp, tipo=tipo).save()
                except Exception as error:
                    print("No se genero:", strp, error)
            messages.add_message(request, messages.SUCCESS,
                                 "Se generaron placas provisionales desde: %s, hasta %s" % (stri, strp))
        else:
            for i in range(d1, df + 1):
                try:
                    if len(str(s2)) == 0:
                        strp = "%s%s%s" % (s1, str.zfill(str(i), 4), s2)
                    else:
                        strp = "%s%s%s" % (s1, str.zfill(str(i), 3), s2)
                    Placas.objects.create(numero=strp, fecha_ingreso=datetime.datetime.now().date()).save()
                except:
                    print("No se genero:", strp)
            messages.add_message(request, messages.SUCCESS, "Se generaron placas desde: %s, hasta %s" % (stri, strp))
    contexto = {
        'placas': Placas.objects.all(),
        'provisionales': PlacaProvisional.objects.all(),
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
    }
    return render(request, 'generador_placas.html', contexto)


def placas(request):
    placa = ""
    if request.GET.get('placa'):
        try:
            placa = Placas.objects.get(numero=str.upper(request.GET.get('placa')))

        except:
            messages.add_message(request, messages.ERROR, "No hay ninguna placa registrada..!")
            return HttpResponseRedirect('placas')
    if request.POST:
        if not placa.fecha_entrega:
            placa.fecha_entrega = datetime.datetime.now().date()
        placa.nombres = str.upper(request.POST.get('nombres'))
        placa.apellidos = str.upper(request.POST.get('apellidos'))
        placa.cedula = request.POST.get('cedula')
        placa.estado = True
        placa.usuario = request.user

        placa.numero_tramite = request.POST.get('numero_tramite')

        placa.cedula_propietario =str.upper(request.POST.get('cedula_propietario'))
        placa.nombres_propietario =str.upper(request.POST.get('nombres_propietario'))
        placa.apellidos_propietario =str.upper(request.POST.get('apellidos_propietario'))

        placa.banco_id = request.POST.get('banco')
        placa.numero_pago = request.POST.get('numero_pago')
        placa.fecha_pago = request.POST.get('fecha_pago')
        placa.valor_pago = request.POST.get('valor_pago')

        placa.save()
        messages.add_message(request, messages.SUCCESS, "Datos registrados exitosamente..!")
        print(placa.fecha_pago)
        return HttpResponseRedirect('placas?placa=%s' % placa.numero)

    contexto = {
        'placa': placa,
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
        'placasentregadas': Placas.objects.filter(estado=True),
        'bancos': Banco.objects.all().order_by('nombre')
    }
    return render(request, 'placas.html', contexto)


def placaprovisional(request):
    placas = PlacaProvisional.objects.all()
    if request.POST:
        placa = placas.filter(numero=request.POST.get('placa'))
        if placa.first().fecha_solicitud:
            placa = PlacaProvisional()
            placa.numero = request.POST.get('placa')
        else:
            placa = placa.first()
        placa.fecha_solicitud = request.POST.get('fechasolicitud')
        placa.fecha_emision = datetime.datetime.now().date()
        placa.fecha_caducidad = (datetime.datetime.now() + datetime.timedelta(days=90)).date()
        placa.propietario = str.upper(request.POST.get('propietario'))
        placa.tipo_servicio = str.upper(request.POST.get('tipo'))
        placa.usuario = request.user
        placa.save()
        messages.add_message(request, messages.SUCCESS, 'Se ha registrado una renovación de placa..!!')
        return HttpResponseRedirect("placas_provisional?placa=%s" % placa.numero)
    contexto = {
        'placas': placas,
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),

    }
    if request.GET.get('p'):
        placa = placas.get(id=request.GET.get('p'))
        contexto = {
            'placa': placa,
        }
        if placa.tipo == "MOTO":
            return render(request, 'pdf_placa_moto.html', contexto)
        else:
            return render(request, 'pdf_placa_p.html', contexto)
    return render(request, 'placas_provisional.html', contexto)


def duplicadoPlaca(request):
    placa = None
    duplicado = None
    dpl = None
    if request.GET.get('placa'):
        try:
            placa = Placas.objects.get(numero=request.GET.get('placa'))
        except:
            messages.add_message(request, messages.ERROR, 'La placa que solicita no existe en la base de datos..!')
    try:
        dpl = DuplicadoPlacas.objects.filter(placa__numero=request.GET.get('placa'), eliminado=False)
    except:
        pass

    if request.GET.get('eliminado'):
        dd = DuplicadoPlacas.objects.get(id=request.GET.get('eliminado'))
        dd.eliminado = True
        dd.save()
        messages.add_message(request, messages.ERROR, 'Registro se ha eliminado..!')
        return HttpResponseRedirect('duplicado_placas?placa=%s' % (placa.numero))

    if request.POST:
        if placa.estado:
            duplicado = DuplicadoPlacas()
            duplicado.fecha_entrega = datetime.datetime.now().date()
            duplicado.placa = placa
            duplicado.nombres = str.upper(request.POST.get('nombres'))
            duplicado.apellidos = str.upper(request.POST.get('apellidos'))
            duplicado.cedula = request.POST.get('cedula')
            duplicado.estado = True
            duplicado.usuario = request.user
            duplicado.save()
            messages.add_message(request, messages.INFO, 'Se ha registrado..!')
            return HttpResponseRedirect('duplicado_placas?placa=%s' % (placa.numero))
        else:
            placa.fecha_entrega = datetime.datetime.now().date()
            placa.nombres = str.upper(request.POST.get('nombres'))
            placa.apellidos = str.upper(request.POST.get('apellidos'))
            placa.cedula = request.POST.get('cedula')
            placa.estado = True
            placa.usuario = request.user
            placa.save()
    contexto = {
        'placa': placa,
        'duplicados': dpl,
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
        'entregadas': DuplicadoPlacas.objects.all(),
    }
    return render(request, 'placas_duplicado.html', contexto)


def imprimir_acta(request):
    placa = None
    dp = None
    if request.GET.get('dp'):
        dp = DuplicadoPlacas.objects.get(id=request.GET.get('dp'))
    else:
        placa = Placas.objects.get(id=request.GET.get('id'))

    contexto = {
        'fecha': datetime.datetime.now(),
        'placa': placa,
        'funcionario': request.user.get_full_name(),
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
        'duplicado': dp
    }
    return render_to_pdf('entrega_placa.html', contexto)

def buscar_rangos(p='',s='',d=0,h=0):
    lista=[]
    pl=""
    for x in range(int(d),int(h)):
        try:
            if s:
                pl=p + str.zfill(str(x), 3) + s
            else:
                pl = p + str.zfill(str(x), 3)
            px=Placas.objects.get(numero=pl)
            lista.append(px)
        except:
            pass
    print(lista)
    return lista

def reporte_placas(request):
    placas = None
    try:
        if request.GET.get('f1') != '' and request.GET.get('f2') != '':
            placas = Placas.objects.filter(
                fecha_entrega__gte=request.GET.get('f1'),
                fecha_entrega__lte=request.GET.get('f2')
            )
            messages.add_message(request, messages.INFO,
                                 'listado del %s al %s' % (request.GET.get('f1'), request.GET.get('f2')))
        elif request.GET.get('f1') != '':
            placas = Placas.objects.filter(fecha_entrega=request.GET.get('f1'))
            messages.add_message(request, messages.INFO, 'listado la fecha: %s' % request.GET.get('f1'))
        elif request.GET.get('f2') != '':
            placas = Placas.objects.filter(fecha_entrega=request.GET.get('f2'))
            messages.add_message(request, messages.INFO, 'listado la fecha: %s' % request.GET.get('f2'))
    except:
        pass

    if request.GET.get('p'):
        placas = buscar_rangos(request.GET.get('p'),request.GET.get('s'),request.GET.get('desde'),request.GET.get('hasta'))
        messages.add_message(request,messages.INFO,'Búsqueda por rangos numéricos')

    if request.GET.get('f'):
        placas=Placas.objects.filter(estado=False).order_by('numero')
    if request.GET.get('t'):
        placas = Placas.objects.filter(estado=True).order_by('numero')
    contexto = {
        'placas': placas,
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
    }
    return render(request, 'reporte_placas.html', contexto)

def reporte_placas_pdf(request):
    f1=None
    f2=None
    p = ""
    s = ""
    t=""
    f=""
    desde = ""
    hasta = ""
    placas=None
    if request.GET.get('f1'):
        placas = Placas.objects.filter(
            fecha_entrega__gte=request.GET.get('f1'),
            fecha_entrega__lte=request.GET.get('f2')
        ).order_by('numero')
        date_format = '%Y-%m-%d'
        f1 = datetime.datetime.strptime(request.GET.get('f1'), date_format).date()
        f2 = datetime.datetime.strptime(request.GET.get('f2'), date_format).date()
    if request.GET.get('p'):
        p=request.GET.get('p')
        s=request.GET.get('s')
        desde=request.GET.get('desde')
        hasta=request.GET.get('hasta')
        placas = buscar_rangos(request.GET.get('p'),request.GET.get('s'),request.GET.get('desde'),request.GET.get('hasta'))
    if request.GET.get('f'):
        placas=Placas.objects.filter(estado=False).order_by('numero')
        f="no"
    if request.GET.get('t'):
        placas = Placas.objects.filter(estado=True).order_by('numero')
        t="yes"
    contexto={
        'placas':placas,
        'f1':f1,
        'f2':f2,
        'p':p,
        's':s,
        'desde':str.zfill(desde,3),
        'hasta':str.zfill(hasta,3),
        'f':f,
        't':t,
    }
    return render_to_pdf('reporte_placas_pdf.html',contexto)