from django.shortcuts import render, redirect, get_object_or_404
from .forms import Formulariopieza, Formularioequipo, Formulariomarca, Formularioubicacion, Formularioentrada, Formulariosalida, Formularioarea
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import pieza, rentrada, rsalida, equipo, marca, ubicacion
from openpyxl import Workbook
from django.http.response import HttpResponse
import datetime
from datetime import date


# Create your views here.
def invalmacen(request):
	datos = pieza.objects.all()
	return render(request, 'tables.html', {"datos": datos})


@login_required(login_url='/acceder')
def crear_pieza(request):
    if request.method == "POST":
        form = Formulariopieza(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            titulo = form.cleaned_data.get("referencia")
            messages.success(request, f"La referencia {titulo} se ha creado correctamente")
            return redirect("invalmacen")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    datosequipo = equipo.objects.all()
    datosmarca = marca.objects.all()
    datosubicacion = ubicacion.objects.all()
    form = Formulariopieza()
    return render(request, "crear_pieza.html", {"form": form, "datosequipo": datosequipo, "datosmarca": datosmarca, "datosubicacion": datosubicacion})


@login_required(login_url='/acceder')
def ActualizarPieza(request, pieza_id):
        instance= get_object_or_404(pieza, pk=pieza_id)
        form = Formulariopieza(request.POST or None, instance=instance)
        context= {'form': form}
        if form.is_valid():
                obj= form.save(commit= False)
                obj.save()
                messages.success(request, "La pieza fue actualizada")
                return redirect("invalmacen")

        else:
                context= {'form': form, 'error': 'Error al actualizar'}
                return render(request,'actualizar_pieza.html' , context)


############################################
@login_required(login_url='/acceder')
def crear_equipo(request):
    if request.method == "POST":
        form = Formularioequipo(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            titulo = form.cleaned_data.get("nombre")
            messages.success(request, f"El equipo {titulo} se ha creado correctamente")
            return redirect("crear_pieza")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    form = Formularioequipo()
    return render(request, "crearequipo.html", {"form": form})


@login_required(login_url='/acceder')
def crear_marca(request):
    if request.method == "POST":
        form = Formulariomarca(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            titulo = form.cleaned_data.get("nombre")
            messages.success(request, f"La marca {titulo} se ha creado correctamente")
            return redirect("crear_pieza")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    form = Formulariomarca()
    return render(request, "crearmarca.html", {"form": form})


@login_required(login_url='/acceder')
def crear_ubicacion(request):
    if request.method == "POST":
        form = Formularioubicacion(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            titulo = form.cleaned_data.get("nombre")
            messages.success(request, f"La ubicacion {titulo} se ha creado correctamente")
            return redirect("crear_pieza")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    form = Formularioubicacion()
    return render(request, "crearubicacion.html", {"form": form})


@login_required(login_url='/acceder')
def crear_area(request):
    if request.method == "POST":
        form = Formularioarea(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            titulo = form.cleaned_data.get("nombre")
            messages.success(request, f"El area {titulo} se ha creado correctamente")
            return redirect("crear_inventrada")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    form = Formularioarea()
    return render(request, "crear_area.html", {"form": form})


############################################################
def invalmacenentrada(request):
	datos = rentrada.objects.all()
	return render(request, 'invrentrada.html', {"datos": datos})


@login_required(login_url='/acceder')
def crear_inventrada(request, id):
    if request.method == "POST":
        form = Formularioentrada(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.autor = request.user
            post.save()
            titulo = form.cleaned_data.get("referencia")
            refex = form.cleaned_data.get("referencia")
            y = form.cleaned_data.get("cantidad")
            x = pieza.objects.only('referencia').filter(referencia=refex)[0]
            nuevo = x.cantidad + y
            dateact = date.today()
            update = pieza.objects.values('cantidad').filter(referencia=refex).update(cantidad=nuevo)
            update = pieza.objects.values('fecha_actualizacion').filter(referencia=refex).update(fecha_actualizacion=dateact)
            messages.success(request, f"La entrada con referencia {titulo} se ha creado correctamente")
            return redirect("invalmacen")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))
    
    datos = pieza.objects.get(id=id)
    return render(request, "crearinventrada.html", {"datos": datos})


 
def invalmacensalida(request):
	datos = rsalida.objects.all()
	return render(request, 'invrsalida.html', {"datos": datos})


@login_required(login_url='/acceder')
def crear_invsalida(request, id):
    if request.method == "POST":
        form = Formulariosalida(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.autor = request.user
            post.save()
            titulo = form.cleaned_data.get("referencia")
            refex = form.cleaned_data.get("referencia")
            y = form.cleaned_data.get("cantidad")
            x = pieza.objects.only('referencia').filter(referencia=refex)[0]
            nuevo = x.cantidad - y
            dateact = date.today()
            update = pieza.objects.values('cantidad').filter(referencia=refex).update(cantidad=nuevo)
            update = pieza.objects.values('fecha_actualizacion').filter(referencia=refex).update(fecha_actualizacion=dateact)
            messages.success(request, f"La salida {titulo} se ha creado correctamente")
            return redirect("invalmacen")
        else:
            for field, items in form.errors.items():
                for item in items:
                    messages.error(request, '{}: {}'.format(field, item))

    datos = pieza.objects.get(referencia=id)
    return render(request, "crearinvsalida.html", {"datos": datos})

##Busqueda####################################################################

@login_required(login_url='/acceder')
def buscar(request):
    if request.method == "POST":
        datospieza = request.POST['referencia']
        datosequipo = request.POST['equipo']
        datosmarca = request.POST['marca']
        datosubicacion = request.POST['ubicacion']
        datosbuscar = request.POST['buscar']
        if  datospieza == "" and datosequipo == "Selecciona un Equipo" and datosmarca == "Selecciona una Marca" and datosubicacion == "Selecciona una Ubicacion" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.all()
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datospieza == "" and datosequipo == "Selecciona un Equipo" and datosmarca == "Selecciona una Marca" and datosubicacion == "Selecciona una Ubicacion" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(descripcion_pieza__icontains=datosbuscar)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif datosequipo == "Selecciona un Equipo" and datosmarca == "Selecciona una Marca" and datosubicacion == "Selecciona una Ubicacion" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(referencia__icontains=datospieza)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datospieza == "" and datosmarca == "Selecciona una Marca" and datosubicacion == "Selecciona una Ubicacion" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(equipo_id=datosequipo)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datosequipo == "Selecciona un Equipo" and datospieza == "" and datosubicacion == "Selecciona una Ubicacion" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(marca_id=datosmarca)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datosequipo == "Selecciona un Equipo" and datosmarca == "Selecciona una Marca" and datospieza == "" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(ubicacion_id=datosubicacion)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datospieza == "" and datosubicacion == "Selecciona una Ubicacion" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(equipo_id=datosequipo).filter(marca_id=datosmarca)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datospieza == "" and datosmarca == "Selecciona una Marca" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(equipo_id=datosequipo).filter(ubicacion_id=datosubicacion)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})
        elif  datospieza == "" and datosequipo == "Selecciona un Equipo" and datosbuscar == "" :
            xdatospieza = pieza.objects.all()
            xdatosequipo = equipo.objects.all()
            xdatosmarca = marca.objects.all()
            xdatosubicacion = ubicacion.objects.all()
            datos = pieza.objects.filter(marca_id=datosmarca).filter(ubicacion_id=datosubicacion)
            return render(request, "buscar.html", {"datos": datos, "datospieza": xdatospieza, "datosequipo": xdatosequipo, "datosmarca": xdatosmarca, "datosubicacion": xdatosubicacion})

    datospieza = pieza.objects.all()
    datosequipo = equipo.objects.all()
    datosmarca = marca.objects.all()
    datosubicacion = ubicacion.objects.all()
    return render(request, "buscar.html", {"datospieza": datospieza, "datosequipo": datosequipo, "datosmarca": datosmarca, "datosubicacion": datosubicacion})


####### EXCEL #########################################################################

@login_required(login_url='/acceder')
def ReporteExcelInventario(request):
    inventarios = pieza.objects.all()
    datosequipo = equipo.objects.all()
    datosmarca = marca.objects.all()
    datosubicacion = ubicacion.objects.all()
    fecha = datetime.datetime.now()
    fe = str(fecha)
    wb = Workbook()
    ws = wb.active
    ws['B1'] = 'REPORTE DE INVENTARIO'

    ws.merge_cells('B1:L1')

    ws['B2'] = datetime.datetime.now()

    ws.merge_cells('B2:D2')

    ws['B3'] = 'No. DE PEDIDO'
    ws['C3'] = 'REFERENCIA'
    ws['D3'] = 'EQUIPO'
    ws['E3'] = 'DESCRIPCIÓN DE ETIQUETA'
    ws['F3'] = 'DESCRIPCIÓN'
    ws['G3'] = 'MARCA'
    ws['H3'] = 'ESTATUS'
    ws['I3'] = 'UBICACION'
    ws['J3'] = 'CANTIDAD'
    ws['K3'] = 'FECHA DE ACTUALIZACION'
    ws['L3'] = 'COLUMN1'

    cont = 4

    for inventario in inventarios:
        for datoequipo in datosequipo:
            if inventario.equipo_id == datoequipo.id:
                excelequipo = datoequipo.nombre
        for datomarca in datosmarca:
            if inventario.marca_id == datomarca.id:
                excelmarca = datomarca.nombre
        for datoubicacion in datosubicacion:
            if inventario.ubicacion_id == datoubicacion.id:
                excelubicacion = datoubicacion.nombre
        ws.cell(row=cont, column=2).value = inventario.n_pedido
        ws.cell(row=cont, column=3).value = inventario.referencia
        ws.cell(row=cont, column=4).value = excelequipo
        ws.cell(row=cont, column=5).value = inventario.descripcion_etiqueta
        ws.cell(row=cont, column=6).value = inventario.descripcion_pieza
        ws.cell(row=cont, column=7).value = excelmarca
        ws.cell(row=cont, column=8).value = inventario.estatus
        ws.cell(row=cont, column=9).value = excelubicacion
        ws.cell(row=cont, column=10).value = inventario.cantidad
        ws.cell(row=cont, column=11).value = inventario.fecha_actualizacion
        ws.cell(row=cont, column=12).value = inventario.Column1
        cont += 1

    nombre_archivo = "ReporteInventario "+fe+".xlsx"
    response = HttpResponse(content_type="application/ms-excel")
    content = "attachment; filename = {0}".format(nombre_archivo)
    response['Content-Disposition'] = content
    wb.save(response)
    return response


@login_required(login_url='/acceder')
def ReporteExcelInvEntrada(request):
    inventarios = pieza.objects.all()
    datosentrada = rentrada.objects.all()
    fecha = datetime.datetime.now()
    fe = str(fecha)
    wb = Workbook()
    ws = wb.active
    ws['B1'] = 'REPORTE DE INVENTARIO ENTRADA'

    ws.merge_cells('B1:L1')

    ws['B2'] = datetime.datetime.now()

    ws.merge_cells('B2:D2')

    ws['B3'] = 'NO. PEDIDO o contrato'
    ws['C3'] = 'REFERENCIA'
    ws['D3'] = 'CANTIDAD'
    ws['E3'] = 'FECHA ALTA'
    
    cont = 4

    for datoentrada in datosentrada:
        for inventario in inventarios:
            if datoentrada.referencia_id == inventario.id:
                excelreferencia = inventario.referencia
        ws.cell(row=cont, column=2).value = datoentrada.n_pedido
        ws.cell(row=cont, column=3).value = excelreferencia
        ws.cell(row=cont, column=4).value = datoentrada.cantidad
        ws.cell(row=cont, column=5).value = datoentrada.fecha_alta
        cont += 1

    nombre_archivo = "ReporteInventarioEntrada "+fe+".xlsx"
    response = HttpResponse(content_type="application/ms-excel")
    content = "attachment; filename = {0}".format(nombre_archivo)
    response['Content-Disposition'] = content
    wb.save(response)
    return response


@login_required(login_url='/acceder')
def ReporteExcelInvSalida(request):
    inventarios = pieza.objects.all()
    datossalida = rsalida.objects.all()
    datosequipo = equipo.objects.all()
    datosmarca = marca.objects.all()
    datosubicacion = ubicacion.objects.all()
    fecha = datetime.datetime.now()
    fe = str(fecha)
    wb = Workbook()
    ws = wb.active
    ws['B1'] = 'REPORTE DE INVENTARIO SALIDA'

    ws.merge_cells('B1:L1')

    ws['B2'] = datetime.datetime.now()
    
    ws.merge_cells('B2:D2')

    ws['B3'] = 'QUIEN RETIRA'
    ws['C3'] = 'REFERENCIA'
    ws['D3'] = 'EQUIPO'
    ws['E3'] = 'MARCA'
    ws['F3'] = 'UBICACION'
    ws['G3'] = 'CANTIDAD'
    ws['H3'] = 'FECHA'
    
    cont = 4

    for datosalida in datossalida:
        for inventario in inventarios:
            if datosalida.referencia_id == inventario.id:
                excelreferencia = inventario.referencia
            for datoequipo in datosequipo:
                if inventario.equipo_id == datoequipo.id:
                    excelequipo = datoequipo.nombre
            for datomarca in datosmarca:
                if inventario.marca_id == datomarca.id:
                    excelmarca = datomarca.nombre
            for datoubicacion in datosubicacion:
                if inventario.ubicacion_id == datoubicacion.id:
                    excelubicacion = datoubicacion.nombre
        ws.cell(row=cont, column=2).value = datosalida.autor
        ws.cell(row=cont, column=3).value = excelreferencia
        ws.cell(row=cont, column=4).value = excelequipo
        ws.cell(row=cont, column=5).value = excelmarca
        ws.cell(row=cont, column=6).value = excelubicacion
        ws.cell(row=cont, column=7).value = datosalida.cantidad
        ws.cell(row=cont, column=8).value = datosalida.fecha_alta
        cont += 1

    nombre_archivo = "ReporteInventarioSalida "+fe+".xlsx"
    response = HttpResponse(content_type="application/ms-excel")
    content = "attachment; filename = {0}".format(nombre_archivo)
    response['Content-Disposition'] = content
    wb.save(response)
    return response





