#--Aca van almacenados los metodos que se llaman desde el JSON
#--Importa la biblioteca del sistema operativo de Python
import os
#--Importa la biblioteca de hora de Pythob
import time
#--Importa biblioteca de conexion a bd oracle
import cx_Oracle
#--Importa la bibloteca para manejo de respuestas http
from django.http import HttpResponse
#--Importa el decorador para evitar la solicitud de autenticacion - REST -
from django.views.decorators.csrf import csrf_exempt
#--Importa la biblioteca para hacer manejo del JSON
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status
#--Importa la biblioteca para ver el api
from rest_framework.decorators import api_view
#--Importa la biblioteca para construir el Response del REST
from rest_framework.response import Response
#--Importa el modelo de la actividad
from actividades.models import Actividad
#--Importa el modelo del modulo
from modulos.models import Modulo
#--Importa el serializador
from actividades.serializers import *
#--Clase que se encarga de construir 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)

#--Definicion que se encarga de del manejo de la actividad LIST
#--Entrada: El tipo de Request
#--Salida: EL JSON con los datos
@csrf_exempt
def actividad_list(request):
    #--Verifica si la entrada de los datos viene por GET o por POST
    if request.method == 'GET':
        #--Busca los datos correspondientes a las actividades y las organiza por el nombre
        actividades = sorted(Actividad.objects.all(), key=lambda a: a.nombre)
        #--Se consruye un contenedor para almacenar los datos con sus atributos
        contenedor=[]
        #--Variable que maneja la cantidad de filas que contiene los datos
        fila=1
        #--Recorre las actividades para extraer los datos correspondientes
        for actividad in actividades:
            #--Variable que maneja los atributos de cada actividad
            info={}
            #--Ingresa los atributos
            info["id_actividad"]=actividad.id_actividad
            info["id_modulo"]=actividad.id_modulo.id_modulo
            info["nombre_mod"]=actividad.id_modulo.nombre
            info["nombre"]=actividad.nombre
            info["descripcion"]=actividad.descripcion
            info["programa"]=actividad.programa
            info["rownum_"] = fila
            #--Almacena el objeto en el contenedor
            contenedor.append(info)
            #--Sube en uno la cantidad de filas procesadas
            fila+=1
        #--Setea la respuesta del JSON de acuerdo a lo solicitado por GWT
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(actividades)
        response['startRow']=0
        response['endRow']=len(actividades)
        response['data']=contenedor
        total['response']=response
        #--Retorna el JSON correspondiente
        return JSONResponse(total)
    elif request.method == 'POST':
        #--Busca los datos correspondientes a las actividades y las organiza por el nombre
        actividades = sorted(Actividad.objects.all(), key=lambda a: a.nombre)
        #--Se consruye un contenedor para almacenar los datos con sus atributos
        contenedor=[]
        #--Variable que maneja la cantidad de filas que contiene los datos
        fila=1
        #--Recorre las actividades para extraer los datos correspondientes
        for actividad in actividades:
            #--Variable que maneja los atributos de cada actividad
            info={}
            #--Ingresa los atributos
            info["id_actividad"]=actividad.id_actividad
            info["id_modulo"]=actividad.id_modulo.id_modulo
            info["nombre_mod"]=actividad.id_modulo.nombre
            info["nombre"]=actividad.nombre
            info["descripcion"]=actividad.descripcion
            info["programa"]=actividad.programa
            info["rownum_"] = fila
            #--Almacena el objeto en el contenedor
            contenedor.append(info)
            #--Sube en uno la cantidad de filas procesadas
            fila+=1
        #--Setea la respuesta del JSON de acuerdo a lo solicitado por GWT
        response={}
        total={}
        response['status']=0
        response['totalRows']=len(actividades)
        response['startRow']=0
        response['endRow']=len(actividades)
        response['data']=contenedor
        total['response']=response
        #--Retorna el JSON correspondiente
        return JSONResponse(total)


#--Definicion que se encarga de del manejo de la actividad ADD
#--Entrada: El tipo de Request
#--Salida: EL JSON con los datos
@csrf_exempt
def actividad_ingresa(request):
    #--Verifica si la entrada de los datos viene por GET o por POST
    if request.method == 'GET':
        #--Ingresa las variables enviadas por GET
        id_modulo=request.GET.get('id_modulo')
        nombre=request.GET.get('nombre')
        descripcion=request.GET.get('descripcion')
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        programa=request.GET.get('programa')
        #--Verifica si el programa esta vacia
        if programa is None:
            programa=""
        #--Busca el modulo al que esta asociado
        modulo = Modulo.objects.get(id_modulo=id_modulo)
        #--Crea objeto en DJANGO para ingresar la informacion
        a=Actividad(id_modulo=modulo,nombre=nombre,descripcion=descripcion,programa=programa) 
        #--Graba la informacion correspondiente en el modelo
        a.save() 
        #--Trae la informacion ingresada en el modelo
        actividades = Actividad.objects.get(id_actividad=a.id_actividad)
        #--Serializa la informacion para ingresarla en el JSON
        serializer = ActividadSerializer(actividades)
        #--Arma el JSON con la informacion
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=serializer.data
        total['response']=response
        #--Retorna el JSON correspondiente
        return JSONResponse(total)
    if request.method == 'POST':
        #--Ingresa las variables enviadas por POST
        id_modulo=request.POST.get('id_modulo')
        nombre=request.POST.get('nombre')
        descripcion=request.POST.get('descripcion')
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        programa=request.POST.get('programa')
        #--Verifica si el programa esta vacia
        if programa is None:
            programa=""
        #--Busca el modulo al que esta asociado
        modulo = Modulo.objects.get(id_modulo=id_modulo)
        #--Crea objeto en DJANGO para ingresar la informacion
        a=Actividad(id_modulo=modulo,nombre=nombre,descripcion=descripcion,programa=programa) 
        #--Graba la informacion correspondiente en el modelo
        a.save() 
        #--Trae la informacion ingresada en el modelo
        actividades = Actividad.objects.get(id_actividad=a.id_actividad)
        #--Serializa la informacion para ingresarla en el JSON
        serializer = ActividadSerializer(actividades)
        #--Arma el JSON con la informacion
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=serializer.data
        total['response']=response
        #--Retorna el JSON correspondiente
        return JSONResponse(total)

#--Definicion que se encarga de del manejo de la actividad ADD
#--Entrada: El tipo de Request
#--Salida: EL JSON con los datos
@csrf_exempt
def actividad_actualiza(request):
    #--Verifica si la entrada de los datos viene por GET o por POST
    if request.method == 'GET':
        #--Ingresa las variables enviadas por GET
        id_actividad=request.GET.get('id_actividad')
        id_modulo=request.GET.get('id_modulo')
        nombre=request.GET.get('nombre')
        descripcion=request.GET.get('descripcion')
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        programa=request.GET.get('programa')
        #--Verifica si el programa esta vacia
        if programa is None:
            programa=""
        #--Busca el modulo al que esta asociado
        modulo = Modulo.objects.get(id_modulo=id_modulo)
        #--Busca la actividad a actualizar
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Ingresa la informacion
        actividades.id_modulo=modulo
        actividades.nombre = nombre
        actividades.descripcion = descripcion
        actividades.programa = programa
        #--Graba la informacion
        actividades.save()
        #--Trae la informacion ingresada previamente
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Serializa la informacion del objeto
        serializer = ActividadSerializer(actividades)
        #--Arma el JSON de respuesta
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=serializer.data
        total['response']=response
        #--Devuelve el JSON correspondiente
        return JSONResponse(total)
    if request.method == 'POST':
        #--Ingresa las variables enviadas por POST
        id_actividad=request.POST.get('id_actividad')
        id_modulo=request.POST.get('id_modulo')
        nombre=request.POST.get('nombre')
        descripcion=request.POST.get('descripcion')
        #--Verifica si la descripcion esta vacia
        if descripcion is None:
            descripcion=""
        programa=request.POST.get('programa')
        #--Verifica si el programa esta vacia
        if programa is None:
            programa=""
        #--Busca el modulo al que esta asociado
        modulo = Modulo.objects.get(id_modulo=id_modulo)
        #--Busca la actividad a actualizar
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Ingresa la informacion
        actividades.id_modulo=modulo
        actividades.nombre = nombre
        actividades.descripcion = descripcion
        actividades.programa = programa
        #--Graba la informacion
        actividades.save()
        #--Trae la informacion ingresada previamente
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Serializa la informacion del objeto
        serializer = ActividadSerializer(actividades)
        #--Arma el JSON de respuesta
        response={}
        total={}
        response['status']=0
        response['totalRows']=1
        response['startRow']=0
        response['endRow']=0
        response['data']=serializer.data
        total['response']=response
        #--Devuelve el JSON correspondiente
        return JSONResponse(total)

#--Definicion que se encarga de del manejo de la actividad ADD
#--Entrada: El tipo de Request
#--Salida: EL JSON con los datos
@csrf_exempt
def actividad_elimina(request):
    #--Verifica si la entrada de los datos viene por GET o por POST
    if request.method == 'GET':
        #--Captura los datos que vienen por GET
        id_actividad=request.GET.get('id_actividad')
        #--Busca la actividad a eliminar
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Elimina la actividad
        actividades.delete()
        #--Prepara el JSON para devovler la informacion que se elimino
        borro={}
        devuelve={}
        borro['id_actividad']=id_actividad
        devuelve['response']=borro
        #--Devuelve el JSON correspondiente
        return JSONResponse(devuelve)
    if request.method == 'POST':
        #--Captura los datos que vienen por POST
        id_actividad=request.POST.get('id_actividad')
        #--Busca la actividad a eliminar
        actividades = Actividad.objects.get(id_actividad=id_actividad)
        #--Elimina la actividad
        actividades.delete()
        #--Prepara el JSON para devovler la informacion que se elimino
        borro={}
        devuelve={}
        borro['id_actividad']=id_actividad
        devuelve['response']=borro
        #--Devuelve el JSON correspondiente
        return JSONResponse(devuelve)