import datetime
import pandas as pd
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db import connection
from django.db.models import Sum, Count
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render

from Consultas.models import Placas, Extenos
from Costos.models import Plantilla
from Estadistica.models import CantidadTipo, EstadisticaFecha, TotalUsuariosFecha, Rubro, EstadisticaUsuarioTipo
from Index.models import Archivos
from Oficios.models import TipoDocumento
from TransitoApp.snnipers import render_to_pdf
from Vial.models import Informe

meses=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]

# Create your views here.
@login_required(login_url='login_')
def index(request):
    mes = datetime.datetime.now().date().month
    anio = datetime.datetime.now().date().year
    if request.GET.get('y'):
        anio=int(request.GET.get('y'))
    if request.GET.get('m'):
        mes=int(request.GET.get('m'))
    print(mes,anio)
    informes=Informe.objects.filter(
        fecha__month=mes,fecha__year=anio,
    ).order_by('fecha')
    costos=Plantilla.objects.filter(
        fecha__month=mes, fecha__year=anio,
    ).order_by('fecha')
    pp = Placas.objects.filter(
        fecha_entrega__month=mes, fecha_entrega__year=anio,
    ).order_by('fecha_entrega')
    placas=Placas.objects.all()
    contexto={
        'informes':informes.values('fecha').annotate(contar=Count('id')).order_by('fecha'),
        "costos":costos.values('fecha').annotate(contar=Count('id')).order_by('fecha'),
        "pplacas": pp.values('fecha_entrega').annotate(contar=Count('id')).order_by('fecha_entrega'),
        'im':informes.count(),
        'cm':costos.count(),
        'mes':meses[mes-1]+" "+str(anio),
        'placast':placas.count(),
        'placase':placas.filter(estado=True).count(),
        'consultas':Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
        'meses':meses,
        'anios': [a for a in range(2020, datetime.datetime.now().year + 1)],
    }
    return render(request,'index.html',contexto)

@login_required(login_url='login_')
def registroCostos(request):
    if request.POST:
        print(request.POST)
        plantilla=Plantilla()
        if request.GET.get('id'):
            plantilla=Plantilla.objects.get(id=request.GET.get('id'))
            plantilla.modificado_por = request.user.get_full_name()
        plantilla.numero_especie_matricula=request.POST.get('matricula')
        plantilla.numero_especie_rtv=request.POST.get('rtv')
        plantilla.fecha=request.POST.get('fecha')
        plantilla.placa=request.POST.get('placa')
        plantilla.tipo=request.POST.get('tipo')
        plantilla.servicio=request.POST.get('servicio')
        plantilla.duplicado=request.POST.get('duplicado')
        plantilla.rodaje=request.POST.get('rodaje')
        plantilla.estiker=request.POST.get('estikers')
        plantilla.recargos=request.POST.get('recargos')
        plantilla.modificacion=request.POST.get('modificacion')
        plantilla.tonelaje=request.POST.get('tonelaje')
        plantilla.cuv=request.POST.get('cuv')
        plantilla.dominio=request.POST.get('dominio')
        plantilla.total=request.POST.get('total')
        plantilla.usuario=request.POST.get('usuario')
        plantilla.bloqueo = request.POST.get('bloqueo')
        plantilla.duplicado_sin_costo=request.POST.get('sincosto')
        if not request.GET.get('id'):
            plantilla.ingresado_por=request.user.get_full_name()
        if request.POST.get('publico')=='on':
            plantilla.publico=True
        else:
            plantilla.publico=False
        plantilla.save()
        print(request.POST.get('publico'))
        if request.GET.get('id'):
            messages.add_message(request, messages.SUCCESS, "Los datos se han modificado exitosamente..!")
            return HttpResponseRedirect('repcostos?f1=%s&f2=%s#%s'%(request.POST.get('f1'),request.POST.get('f2'),request.GET.get('id')))
        else:
            messages.add_message(request, messages.SUCCESS, "Los datos se han creado exitosamente..!")
            return HttpResponseRedirect('rcostos')


    contexto={
        'fecha': datetime.datetime.now().date(),
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
    }
    return render(request, 'registroCostos.html',contexto)

@login_required(login_url='login_')
def reporteCostos(request):
    if request.GET.get('f1') and request.GET.get('f2'):
        f1=request.GET.get('f1')
        f2=request.GET.get('f2')
    else:
        f1=str(datetime.datetime.now().date())
        f2=str(datetime.datetime.now().date())
    print(f1,f2)
    with connection.cursor() as cursor:
        cursor.callproc('ConsultarTotalesFechas', [str(f1),str(f2)])
        cursor.callproc('ConsultartTotalUsuariosFechas', [str(f1),str(f2)])
        cursor.callproc('ConsularTotalesUsuarioTipo', [str(f1),str(f2)])
        cursor.callproc('cantidadTipo',[str(f1),str(f2)])
        cursor.callproc('rubro', [str(f1), str(f2)])

        cursor.close()
    costos=Plantilla.objects.filter(
        fecha__range=[datetime.datetime.strptime(f1, '%Y-%m-%d'),
                      datetime.datetime.strptime(f2, '%Y-%m-%d')]
    )
    contexto={
        'costos':costos,
        'fecha':datetime.datetime.now().date(),
        'consultas': Extenos.objects.all(),
        'documentos': TipoDocumento.objects.all(),
    }
    return render(request,'reporteCostos.html',contexto)

def modificacion_usuario():
    for p in Plantilla.objects.filter(fecha='2023-07-27'):
        p.ingresado_por = "Erick González Cadena"
        p.save()

def migrarCostos(request):
    #modificacion_usuario()
    if request.POST:
        print(request.FILES)
        ar=Archivos(
            documento=request.FILES['file']
        )
        ar.save()
        print(ar.documento.path)
        df = pd.read_excel(ar.documento.path)
        publico=False
        for index, row in df.iterrows():
            print(row)
            print(str(row["fecha"]).split(" ")[0],row["placa"],row["servicio"],row["duplicado"],
                  row["rodaje"],row["stiker"],row["recargo"],
                  row["modificacion"],row["tonelaje"],row["cuv"],row["dominio"],row["total"],row['publico'],str(row['usuario']))
            if row['publico']=="SI":
                publico=True
            try:
                Plantilla(
                    fecha=str(row["fecha"]).split(" ")[0],
                    tipo=row["tipo"],
                    placa=row["placa"],
                    servicio=float(row["servicio"]),
                    duplicado=float(row["duplicado"]),
                    rodaje=float(row["rodaje"]),
                    estiker=float(row["stiker"]),
                    recargos=float(row["recargo"]),
                    modificacion=float(row["modificacion"]),
                    tonelaje=float(row["tonelaje"]),
                    cuv=float(row["cuv"]),
                    dominio=float(row["dominio"]),
                    total=float(row["total"]),
                    usuario=(row['usuario']),
                    publico=publico,
                    ingresado_por=request.user.get_full_name(),
                ).save()
            except:
                print("[%s] No se registro: "%index,str(row["fecha"]).split(" ")[0], row["placa"], row["servicio"], row["duplicado"], row["rodaje"],
                      row["stiker"], row["recargo"],
                      row["modificacion"], row["tonelaje"], row["cuv"], row["dominio"], row["total"], )
    contexto={

    }

    return render(request,'migrarCostos.html',contexto)

def generar_json_por_mes(request):
    labels=[]
    data= []
    jsont=""
    costos=Plantilla.objects.filter(fecha__range=[datetime.datetime.strptime(request.GET.get('f1'), '%Y-%m-%d'),
            datetime.datetime.strptime(request.GET.get('f2'), '%Y-%m-%d')])
    costos= costos.values('fecha__month').annotate(total=Sum('total'))
    for x in costos:
        print(x['fecha__month'],float(x['total']))
        data.append(float(x['total']))
        m="%s"%meses[x['fecha__month']-1]
        labels.append(m)
    jsont="""'data': [%s],'labels': %s"""%(data,labels)
    return jsont.replace("'",'"')


@login_required(login_url='login_')
def pdf_costos(request):
    costos = Plantilla.objects.all()
    print(request.GET.get('f1'), request.GET.get('f2'))
    if request.GET.get('f1') and request.GET.get('f2'):
        costos = costos.filter(
            fecha__range=[datetime.datetime.strptime(request.GET.get('f1'), '%Y-%m-%d'),
            datetime.datetime.strptime(request.GET.get('f2'), '%Y-%m-%d')]
        )
    estadistica=CantidadTipo.objects.all()
    contexto={
        'usuario':request.user.get_full_name(),
        'costos':costos,
        'f1':datetime.datetime.strptime(request.GET.get('f1'), '%Y-%m-%d'),
        'f2':datetime.datetime.strptime(request.GET.get('f2'), '%Y-%m-%d'),
        'estadistica':estadistica,
        'numero': estadistica.aggregate(suma=Sum('suma')),
        'numero_carros':estadistica.filter(tipo__icontains='CARRO').aggregate(n=Sum('suma')),
        'numero_carros_publicos': costos.filter(publico=True, tipo__icontains='CARRO').count(),
        'numero_motos_publicos': costos.filter(publico=True, tipo__icontains='MOTOCICLETA').count(),

        'por_usuarios':TotalUsuariosFecha.objects.all(),
        'por_rubros':Rubro.objects.all(),
        'total': estadistica.aggregate(total=Sum('totales')),
        'totalmeses':estadistica,
        'grafico':generar_json_por_mes(request)
    }
    return render_to_pdf('pdfCostos.html',contexto)

@login_required(login_url='login_')
def eliminarcosto(request):
    p=Plantilla.objects.get(id=request.GET.get('id'))
    f1=p.fecha
    f2=datetime.datetime.now().date()
    p.delete()
    messages.add_message(request,messages.ERROR,'Registro Eliminado..!')
    return HttpResponseRedirect('repcostos?f1=%s&f2=%s'%(f1,f2))