# Create your views here.
#--Importa la bilbioteca de manejo de sistema operativo python
import os
#--Importa la biblioteca de manejo de tiempo Python
import time
#--Importa la biblioteca de manejo de base de datos Oracle
import cx_Oracle
#--Importa el manejo de respuestas de DJANGO
from django.http import HttpResponse
#--Importa el decorador para manejo de excepcion en la autenticacion
from django.views.decorators.csrf import csrf_exempt
#--Bibliotecas para el manejo del REST y de JSON
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
#--Importa los modelos en caso de necesitarlos
from transacciones.models import Transaccion
from modulos.models import Modulo
from formula.models import Formula
#--Clase que transforma la respuesta en JSON
class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders it's content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)
#---Metodo para Modelo
@csrf_exempt
def formula_list(request):
    if request.method == 'GET':
        id_transaccion = request.GET.get('id_transaccion')
        id_modulo = request.GET.get('id_modulo')
        if id_transaccion is not None and id_modulo is not None:
            formulas = sorted(Formula.objects.filter(id_transaccion=id_transaccion,id_modulo=id_modulo), key=lambda a: a.nombre)
        else:
            if id_transaccion is not None:
                formulas = sorted(Formula.objects.filter(id_transaccion=id_transaccion), key=lambda a: a.nombre_formula)
            elif id_modulo is not None:
                formulas = sorted(Formula.objects.filter(id_modulo=id_modulo), key=lambda a: a.nombre_formula)
            else:
                formulas = sorted(Formula.objects.all(), key=lambda a: a.nombre_formula)
        contenedor=[]
        fila=1
        for formula in formulas:
            info={}
            info["id_formulas"] = formula.id_formulas
            info["id_modulo"] = formula.id_modulo.id_modulo
            info["id_transaccion"] = formula.id_transaccion.id_transaccion
            info["nombre_formula"] = formula.nombre_formula
            info["formula"] = formula.formula
            info["tablas_asociadas"] = formula.tablas_asociadas
            if formula.usa_tablas is not None:
                info["usa_tablas"]=formula.usa_tablas
            else:
                info["usa_tablas"]=None
            info["rownum_"] = fila
            contenedor.append(info)
            fila+=1
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(formulas)
        response['startRow']=0
        response['endRow']=len(formulas)
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
    elif request.method == 'POST':
        id_transaccion = request.POST.get('id_transaccion')
        id_modulo = request.POST.get('id_modulo')
        if id_transaccion is not None and id_modulo is not None:
            formulas = sorted(Formula.objects.filter(id_transaccion=id_transaccion,id_modulo=id_modulo), key=lambda a: a.nombre_formula)
        else:
            if id_transaccion is not None:
                formulas = sorted(Formula.objects.filter(id_transaccion=id_transaccion), key=lambda a: a.nombre_formula)
            elif id_modulo is not None:
                formulas = sorted(Formula.objects.filter(id_modulo=id_modulo), key=lambda a: a.nombre_formula)
            else:
                formulas = sorted(Formula.objects.all(), key=lambda a: a.nombre_formula)
        contenedor=[]
        fila=1
        for formula in formulas:
            info={}
            info["id_formulas"] = formula.id_formulas
            info["id_modulo"] = formula.id_modulo.id_modulo
            info["id_transaccion"] = formula.id_transaccion.id_transaccion
            info["nombre_formula"] = formula.nombre_formula
            info["formula"] = formula.formula
            info["tablas_asociadas"] = formula.tablas_asociadas
            if formula.usa_tablas is not None:
                info["usa_tablas"]=formula.usa_tablas
            else:
                info["usa_tablas"]=None
            info["rownum_"] = fila
            contenedor.append(info)
            fila+=1
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(formulas)
        response['startRow']=0
        response['endRow']=len(formulas)
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
#---Metodo para Modelo
@csrf_exempt
def formula_ingresa(request):
    if request.method == 'GET':
        id_modulo=request.GET.get('id_modulo')
        id_transaccion=request.GET.get('id_transaccion')
        nombre_formula=request.GET.get('nombre_formula')
        formula=request.GET.get('formula')
        tablas_asociadas=request.GET.get('tablas_asociadas')
        usa_tablas=request.GET.get('usa_tablas')
        if tablas_asociadas is None:
            tablas_asociadas=None
        if usa_tablas=="true":
            usa_tablas="1"
        else:
            usa_tablas="0"
        transaccion=Transaccion.objects.get(id_transaccion=id_transaccion)
        modulo=Modulo.objects.get(id_modulo=id_modulo)
        a=Formula(id_modulo=modulo,id_transaccion=transaccion,nombre_formula=nombre_formula,formula=formula,tablas_asociadas=tablas_asociadas,usa_tablas=usa_tablas)
        a.save()
        actividades = Formula.objects.get(id_formulas=a.id_formulas)
        contenedor=[]
        info={}
        info["id_formulas"] = actividades.id_formulas
        info["id_modulo"] = actividades.id_modulo.id_modulo
        info["id_transaccion"] = actividades.id_transaccion.id_transaccion
        info["nombre_formula"] = actividades.nombre_formula
        info["formula"] = actividades.formula
        info["tablas_asociadas"] = actividades.tablas_asociadas
        info["usa_tablas"] = actividades.usa_tablas
        contenedor.append(info)
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
    if request.method == 'POST':
        id_modulo=request.POST.get('id_modulo')
        id_transaccion=request.POST.get('id_transaccion')
        nombre_formula=request.POST.get('nombre_formula')
        formula=request.POST.get('formula')
        tablas_asociadas=request.POST.get('tablas_asociadas')
        usa_tablas=request.POST.get('usa_tablas')
        if tablas_asociadas is None:
            tablas_asociadas=None
        if usa_tablas=="true":
            usa_tablas="1"
        else:
            usa_tablas="0"
        transaccion=Transaccion.objects.get(id_transaccion=id_transaccion)
        modulo=Modulo.objects.get(id_modulo=id_modulo)
        a=Formula(id_modulo=modulo,id_transaccion=transaccion,nombre_formula=nombre_formula,formula=formula,tablas_asociadas=tablas_asociadas,usa_tablas=usa_tablas)
        a.save()
        actividades = Formula.objects.get(id_formulas=a.id_formulas)
        contenedor=[]
        info={}
        info["id_formulas"] = actividades.id_formulas
        info["id_modulo"] = actividades.id_modulo.id_modulo
        info["id_transaccion"] = actividades.id_transaccion.id_transaccion
        info["nombre_formula"] = actividades.nombre_formula
        info["formula"] = actividades.formula
        info["tablas_asociadas"] = actividades.tablas_asociadas
        info["usa_tablas"] = actividades.usa_tablas
        contenedor.append(info)
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
#---Metodo para Modelo
@csrf_exempt
def formula_actualiza(request):
    if request.method == 'GET':
        id_formulas=request.GET.get('id_formulas')
        id_modulo=request.GET.get('id_modulo')
        id_transaccion=request.GET.get('id_transaccion')
        nombre_formula=request.GET.get('nombre_formula')
        formula=request.GET.get('formula')
        tablas_asociadas=request.GET.get('tablas_asociadas')
        usa_tablas=request.POST.get('usa_tablas')
        if tablas_asociadas is None:
            tablas_asociadas=None
        if usa_tablas=="true":
            usa_tablas="1"
        else:
            usa_tablas="0"
        transaccion=Transaccion.objects.get(id_transaccion=id_transaccion)
        modulo=Modulo.objects.get(id_modulo=id_modulo)
        actividades = Formula.objects.get(id_formulas=id_formulas)
        actividades.id_modulo=modulo
        actividades.id_transaccion=transaccion
        actividades.nombre_formula=nombre_formula
        actividades.formula=formula
        actividades.tablas_asociadas=tablas_asociadas
        actividades.usa_tablas=usa_tablas
        actividades.save()
        contenedor=[]
        info={}
        info["id_formulas"] = actividades.id_formulas
        info["id_modulo"] = actividades.id_modulo.id_modulo
        info["id_transaccion"] = actividades.id_transaccion.id_transaccion
        info["nombre_formula"] = actividades.nombre_formula
        info["formula"] = actividades.formula
        info["tablas_asociadas"] = actividades.tablas_asociadas
        info["usa_tablas"] = actividades.usa_tablas
        contenedor.append(info)
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
    if request.method == 'POST':
        id_formulas=request.POST.get('id_formulas')
        id_modulo=request.POST.get('id_modulo')
        id_transaccion=request.POST.get('id_transaccion')
        nombre_formula=request.POST.get('nombre_formula')
        formula=request.POST.get('formula')
        tablas_asociadas=request.POST.get('tablas_asociadas')
        usa_tablas=request.POST.get('usa_tablas')
        if tablas_asociadas is None:
            tablas_asociadas=None
        if usa_tablas=="true":
            usa_tablas="1"
        else:
            usa_tablas="0"
        transaccion=Transaccion.objects.get(id_transaccion=id_transaccion)
        modulo=Modulo.objects.get(id_modulo=id_modulo)
        actividades = Formula.objects.get(id_formulas=id_formulas)
        actividades.id_modulo=modulo
        actividades.id_transaccion=transaccion
        actividades.nombre_formula=nombre_formula
        actividades.formula=formula
        actividades.tablas_asociadas=tablas_asociadas
        actividades.usa_tablas=usa_tablas
        actividades.save()
        contenedor=[]
        info={}
        info["id_formulas"] = actividades.id_formulas
        info["id_modulo"] = actividades.id_modulo.id_modulo
        info["id_transaccion"] = actividades.id_transaccion.id_transaccion
        info["nombre_formula"] = actividades.nombre_formula
        info["formula"] = actividades.formula
        info["tablas_asociadas"] = actividades.tablas_asociadas
        info["usa_tablas"] = actividades.usa_tablas
        contenedor.append(info)
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=contenedor
        total['response']=response
        return JSONResponse(total)
#---Metodo para Modelo
@csrf_exempt
def formula_elimina(request):
    #--Revisa si el requerimiento viene desde GET o POST
    if request.method == 'GET':
        #--Captura los datos para almacenarlos por GET
        id_formulas = request.GET.get('id_formulas')
        #--Busca el asiento a elminiar
        work = Formula.objects.get(id_formulas=id_formulas)
        #--Elimina la Formula
        work.delete()
        #--Prepara el JSON
        borro={}
        devuelve={}
        borro['id_formulas']=id_formulas
        devuelve['response']=borro
        #--Devuelve el asiento
        return JSONResponse(devuelve)
    if request.method == 'POST':
        #--Captura los datos para almacenarlos por POST
        id_formulas=request.POST.get('id_formulas')
        #--Busca el asiento a elminiar
        work = Formula.objects.get(id_formulas=id_formulas)
        #--Elimina la Formula
        work.delete()
        #--Prepara el JSON
        borro={}
        devuelve={}
        borro['id_formulas']=id_formulas
        devuelve['response']=borro
        #--Devuelve el asiento
        return JSONResponse(devuelve)