from django.shortcuts import render_to_response
from django.shortcuts import render ,redirect
from django.template.context import RequestContext
from corporaciones.models import Corporacion , Sede
from django.contrib.auth.decorators import permission_required
from corporaciones.forms import FormularioRegistroCorporacion, FormularioEditarCorporacion , FormularioCargar
from votantes.models import Votante
from planchas.models import Plancha
from candidatos.models import Candidato
from usuarios.models import Usuario
from django.db.models import Q
import csv
# -*- coding: utf-8 -*-
from io import StringIO


@permission_required("usuarios.Administrador" , login_url="/")
def registro_corporacion(request):
    mensaje = ""
    if request.method == 'POST' and "btncreate" in request.POST:
        form = FormularioRegistroCorporacion(request.POST)
        form2 = FormularioCargar(request.POST , request.FILES)

        #Si el formulario es valido y tiene datos
        if form.is_valid():
            #Capture el id de corporacion
            id_corporation = form.cleaned_data["id_corporation"]
            sede = form.cleaned_data["sede"]
            #Consultando la corporacion en la base de datos.
            try:
                corporacion = Corporacion.objects.get(id_corporation=id_corporation , sede=sede)
            except Corporacion.DoesNotExist:
                corporacion = Corporacion()
                corporacion_create(corporacion, form)

                llamarMensaje = "exito_corporacion"
                if form.cleaned_data["facultad"] is  None or form.cleaned_data["sede"] is None:
                    mensaje = "La corporacion "+ str(id_corporation) +" se guardo correctamente"
                else:
                    mensaje = "La corporacion "+ str(id_corporation)  +" sede "+str(sede.nombre_sede)+" se guardo correctamente"

            else:
                if not corporacion.is_active:
                    corporacion_create(corporacion, form)
                    llamarMensaje = "exito_corporacion"
                    mensaje = "La corporación "+ str(id_corporation)  +" se guardo correctamente"
                else:
                    llamarMensaje = "fracaso_corporacion"
                    mensaje = "La corporacion "+ str(corporacion) + " ya esta registrada"

            request.session['llamarMensaje'] = llamarMensaje
            request.session['mensaje'] = mensaje

            return redirect("listar_corporacion")
        else:
            form = FormularioRegistroCorporacion()
            data = {
                'form': form,
            }
            return render_to_response('registro_corporacion.html', data, context_instance=RequestContext(request))

    elif request.method == 'POST' and "btnload" in request.POST:
        form = FormularioRegistroCorporacion()
        form2 = FormularioCargar(request.POST , request.FILES)
         #Si el formulario es valido y tiene datos
        if form2.is_valid():

            try:
                csvf = StringIO(request.FILES['file'].read().decode('ISO-8859-3'))
            except Exception as e:
                llamarMensaje = "fracaso_corporacion"
                mensaje = "Error en el formato del archivo de entrada"
                request.session['llamarMensaje'] = llamarMensaje
                request.session['mensaje'] = mensaje
                return redirect("listar_corporacion")

            reader = csv.reader(csvf, delimiter=';')
            line=0
            counter= 0
            # Verificar y crear si estan creadas las sedes.
            diccionarioSedes= {'CALI':'0', 'BUGA':'1', 'CAICEDONIA':'2', 'CARTAGO':'3',  'PACIFICO':'4',
                               'PALMIRA':'5','TULUA':'6', 'ZARZAL':'7', 'YUMBO':'14',
                               'SANTANDER DE QUILICHAO':'21'}

            #COD. PROGRAMA;PROGRAMA ACADÉMICO;JORNADA;FACULTAD;SEDE
            for nombre,codigo in diccionarioSedes.items():
                try:
                    Sede.objects.get(codigo=codigo, is_active=True)
                except Sede.DoesNotExist:
                    sede = Sede()
                    sede.codigo = codigo
                    sede.nombre_sede = nombre
                    try:
                        sede.save()
                    except Exception as e:
                        print("No se pudo guardar la sede" + sede.nombre_sede)

            # Verificar y crear si estan creadas las facultades
            diccionarioFacultad= { 'CONSEJO SUPERIOR':'1', 'CONSEJO ACADÉMICO':'2',
                                   'INGENIERÍA':'3', 'CIENCIAS DE LA ADMINISTRACIÓN':'4',
                                   'CIENCIAS NATURALES Y EXACTAS':'5', 'HUMANIDADES':'6',
                                  'CIENCIAS SOCIALES Y ECONÓMICAS':'7', 'ARTES INTEGRADAS':'8',
                                  'SALUD':'9', 'INSTITUTO DE EDUCACIÓN Y PEDAGOGÍA':'10' ,
                                  'INSTITUTO DE PSICOLOGÍA': '11'}

            # Creando las facultades

            for nombre,codigo in diccionarioFacultad.items():
                try:
                    Corporacion.objects.get(id_corporation=codigo, is_active=True)
                except Corporacion.DoesNotExist:
                    corporacion = Corporacion()
                    corporacion.id_corporation = codigo

                    # Codigo de las corproaciones que no llevan Facultad
                    if codigo not in {'1' , '2' , '10', '11'}:
                        corporacion.name_corporation = "FACULTAD DE " + nombre
                    else:

                        corporacion.name_corporation = nombre
                    try:
                        corporacion.save()
                    except Exception as e:
                        print("No se pudo guardar la corporacion" + corporacion.name_corporation)


            #COD. PROGRAMA;PROGRAMA ACADÉMICO;JORNADA;FACULTAD;SEDE
            # Ahora crear las corporaciones

            for row in reader:
                if line > 0:
                    try:

                        Corporacion.objects.get(id_corporation=row[0] , sede__codigo=diccionarioSedes.get(row[4]) , is_active=True)
                    except Corporacion.DoesNotExist:
                        corporacion = Corporacion()
                        try:
                            corporacion.id_corporation = row[0]
                            corporacion.name_corporation = row[1]
                            corporacion.facultad = Corporacion.objects.get(id_corporation=diccionarioFacultad.get(row[3]))
                            sede = diccionarioSedes.get(row[4])
                            corporacion.sede = Sede.objects.get(codigo=sede)
                            corporacion.save()
                            counter+= 1
                        except Exception as e:
                            print(e)


                    except Exception as e:
                        llamarMensaje = "fracaso_corporacion"
                        mensaje = "Hubo un problema con el archivo de entrada, no coinciden los datos de entrada con la especificaciones dadaas"
                        request.session['llamarMensaje'] = llamarMensaje
                        request.session['mensaje'] = mensaje
                        return redirect("listar_corporacion")
                else:
                    line =+ 1

            #Consultando la corporacion en la base de datos.
            llamarMensaje = "exito_corporacion"
            mensaje = "Se crearon " + str(counter)+" corporacion(es) sactisfactoriamente"
            request.session['llamarMensaje'] = llamarMensaje
            request.session['mensaje'] = mensaje
            return redirect("listar_corporacion")

    else:
        form = FormularioRegistroCorporacion()
        form2 = FormularioCargar()

    return render(request, 'registro_corporacion.html',{'mensaje': mensaje, 'form': form , 'form2': form2})

# Vista para listar corporaciones
@permission_required("usuarios.Administrador", login_url="/")
def listar_corporacion(request):

    llamarMensaje = request.session.pop('llamarMensaje', None)
    mensaje = request.session.pop('mensaje', None)
    corporaciones = Corporacion.objects.filter(is_active=True)
    return render(request, 'listar_corporaciones.html', {'corporaciones': corporaciones , 'llamarMensaje': llamarMensaje,'mensaje':mensaje })

#Edicion usuarios
@permission_required("usuarios.Administrador" , login_url="/")
def editar_corporacion(request, id_corporation=None):
    corporacion = Corporacion.objects.get(id=id_corporation)
    if request.method == 'POST':
        form = FormularioEditarCorporacion(request.POST)
        #Si el formulario es valido y tiene datos
        if form.is_valid():
            #Capture el id de corporacion
            corporacion.name_corporation = form.cleaned_data["name_corporation"]
            corporacion.facultad = form.cleaned_data["facultad"]
            corporacion.sede = form.cleaned_data["sede"]

             #Actualiza la corporacion en la BD si hay excepcion
            try:
                corporacion.save()
            except Exception as e:
                print(e)

            #Consultando la corporacion en la base de datos.
            llamarMensaje = "edito_corporacion"
            mensaje = "Se editó la corporacion " +str(corporacion) +" sactisfactoriamente"
            request.session['llamarMensaje'] = llamarMensaje
            request.session['mensaje'] = mensaje

            return redirect("listar_corporacion")
        else:
            print("por aca")

    else:
        if id_corporation is None:
            return render(request, 'administrador.html')
        else:
            form = FormularioEditarCorporacion()

            form.initial = {'id_corporation': corporacion.id_corporation, 'name_corporation': corporacion.name_corporation, 'facultad': corporacion.facultad,
                            'sede': corporacion.sede}

            if corporacion.facultad is not None:
                form.fields["facultad"].empty_label = None
                form.fields["sede"].empty_label = None
            else:
                form.fields['facultad'].widget.attrs['disabled'] = True
                form.fields['sede'].widget.attrs['disabled'] = True

        return render(request, 'editar_corporacion.html', {'form': form})


# Este metodo no elimina en la base de datos, sino que desactiva la corporacion
@permission_required("usuarios.Administrador", login_url="/")
def eliminar_corporacion(request, id_corporation=None):
    if request.method == 'POST':
        corporacion=Corporacion.objects.get(id=id_corporation)

        # sacando los votantes de la corporacion
        votantes_corporacion = Votante.objects.filter((Q(plan__facultad__id=corporacion.id) |  Q(plan__id=corporacion.id)) & Q(is_active=True))

        # Si la corporacion tiene votantes
        if votantes_corporacion:
            llamarMensaje = "fracaso_usuario"
            mensaje = "No se eliminó la corporacion " +  str(id_corporation) +" porque tiene votantes asociados"

        else:
            corporacion.is_active = False

            llamarMensaje = "exito_usuario"
            mensaje = "Se eliminó la corporacion " +  str(id_corporation) +" sactisfactoriamente"
            try:
                corporacion.save()
            except Exception as e:
                print(e)

    request.session['llamarMensaje'] = llamarMensaje
    request.session['mensaje'] = mensaje

    return redirect("listar_corporacion")

def corporacion_create(corporacion, form):
    corporacion.id_corporation= form.cleaned_data["id_corporation"]
    corporacion.name_corporation= form.cleaned_data["name_corporation"]
    corporacion.facultad= form.cleaned_data["facultad"]
    corporacion.sede= form.cleaned_data["sede"]
    corporacion.is_active = True

    try:
        corporacion.save()
    except Exception as e:
        print(e)



