#! /usr/bin/python
# -*- coding: utf-8 -*-
import json, os
from django.shortcuts import redirect
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from app_proyecto.models import Proyecto
from app_firmware.models import Firmware, VersionFirmware
from django.conf import settings
from django_angular import General


@csrf_exempt
def insertarVersionFirmware(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _firmware = Firmware.objects.get(pk=request.POST['versionFirmwarePK'])
                valor = request.POST['estadoVersionFirmware']
                if 'clave' in request.POST['txtSintaxisVersion'] and 'valor' in request.POST['txtSintaxisVersion']:
                    _versionFirmware = VersionFirmware(firmware=_firmware,
                                                       version=request.POST['txtVersionFirmware'],
                                                       propiedadesJSON="--",
                                                       modulosJSON="--",
                                                       pinesJSON="__",
                                                       archivo=request.FILES['txtIconoFirmware'],
                                                       sintaxis=request.POST['txtSintaxisVersion'],
                                                       estado=True)
                    if (valor == "0"):
                        _versionFirmware.estado = False
                    else:
                        _versionFirmware.estado = True
                    _versionFirmware.save()
                    dict = obtenerJSON(_versionFirmware, idioma)
                else:
                    if idioma == 'ES':
                        mensaje = "Debe ingresar 'clave y valor en la sintaxis'"
                    else:
                        mensaje = "You must enter 'key and value in the syntax'"
                    dict = {
                        "codError": General.codError,
                        "mensaje": mensaje
                    }
            except Exception as ex:
                if idioma == 'ES':
                    mensaje = "Ha ocurrido error interno"
                else:
                    mensaje = 'Internal error occurred'
                dict = {
                    "codError": General.codError,
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def getListVersionPorFirmware(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _firmware = Firmware.objects.get(pk=request.POST['versionFirmwarePK'])
                _VersionFirmware = VersionFirmware.objects.filter(firmware=_firmware)
                __Firmware = {'pk': _firmware.pk,
                              'nombre': _firmware.nombre,
                              'lenguaje': _firmware.lenguaje,
                              'icono': _firmware.icono.url,
                              'proyecto': _firmware.tipoProyectoCompilador.pk,
                              }
                _listaVersionfirmware = [{'pk': i.pk,
                                          'version': i.version,
                                          'archivo': i.archivo.url,
                                          'estado': i.estado
                                          } for i in _VersionFirmware]
                dict = {
                    "firmware": __Firmware,
                    "listaVersionFirmware": _listaVersionfirmware,
                    "codError": General.codExito
                }
            except:
                if idioma == 'ES':
                    mensaje = "Ha ocurrido error interno"
                else:
                    mensaje = 'Internal error occurred'
                dict = {
                    "codError": General.codError,
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def eliminarVersionFirmware(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _firmware= Firmware.objects.get(pk=request.POST['FirmwarePK'])
                _listaVersionFirmware = VersionFirmware.objects.filter(firmware=_firmware)
                if (len(_listaVersionFirmware) == 0):
                    _firmware.delete()
                else:
                    _versionFirmware = VersionFirmware.objects.get(pk=request.POST['versionFirmwarePK'])
                    _versionFirmware.delete()
                if idioma == 'ES':
                    mensaje = "El firmware se ha eliminado Correctamente"
                else:
                    mensaje = 'The firmware has been successfully deleted'
                dict = {
                    "codError": General.codExito,
                    "mensaje": mensaje
                }
            except Exception as e:
                if idioma == 'ES':
                    mensaje = "Ha ocurrido error interno"
                else:
                    mensaje = 'Internal error occurred'
                dict = {
                    "codError": General.codError,
                    "mensaje": mensaje
                }
        data_json = json.dumps(dict)
        return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def postFirmware(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _proyecto = Proyecto.objects.get(pk=request.POST['proyectoCompilador'])
                _firmware = Firmware(
                    nombre=request.POST['txtNombre'],
                    lenguaje=request.POST['txtLenguaje'],
                    icono=request.FILES['txtIcono'],
                    tipoProyectoCompilador=_proyecto
                )
                _firmware.save()
                valor = request.POST['estado']
                _versionFirmware = VersionFirmware(firmware=_firmware,
                                                   version="Version 1",
                                                   propiedadesJSON="--",
                                                   modulosJSON="--",
                                                   pinesJSON="__",
                                                   archivo=request.FILES['txtArchivoFirmware'],
                                                   sintaxis=request.POST['txtSintaxis'],
                                                   estado=True)
                if (valor == "0"):
                    _versionFirmware.estado = False
                else:
                    _versionFirmware.estado = True
                _versionFirmware.save()
                dict = obtenerJSON(_versionFirmware, idioma)
            except Exception as ex:
                _versionFirmware.delete()
                if idioma == 'ES':
                    mensaje = "Ha ocurrido error interno"
                else:
                    mensaje = 'Internal error occurred'
                dict = {
                    "codError": "1111",
                    "mensaje": mensaje
                }
        data_json = json.dumps(dict)
        return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


def obtenerJSON(_versionFirmware, idioma):
    _urlFirmware = _versionFirmware.archivo.name
    _nombreFirmware = _urlFirmware.split("/")
    infile = open(os.path.join(settings.BASE_DIR, 'media', 'archivo_firmware', _nombreFirmware[1]), 'r')
    auxiliarInicio = False
    contadorInicio = 0
    mensajeJson = "{"
    auxiliarModuloInicio = False
    moduloJSON = "[{"

    auxiliarPinesInicio = False
    pinesJSON = "{"
    for line in infile:
        if line[:-1] == General.etiquetaInicio:
            auxiliarInicio = True
            contadorInicio = contadorInicio + 1
        if line[:-1] == General.etiquetaFin:
            contadorInicio = contadorInicio + 1
            auxiliarInicio = False
        if line == General.etiquetaFin:
            contadorInicio = contadorInicio + 1

        if line[:-1] == General.etiquetaModuloInicio:
            auxiliarModuloInicio = True
        if line[:-1] == General.etiquetaModuloFin:
            moduloJSON = moduloJSON[:-1] + " } , { "
            auxiliarModuloInicio = False
        if line == General.etiquetaModuloFin:
            moduloJSON = moduloJSON[:-1] + " } , { "
            auxiliarModuloInicio = False

        if line[:-1] == General.etiquetaPinesInicio:
            auxiliarPinesInicio = True
        if line[:-1] == General.etiquetaPinesFin:
            auxiliarPinesInicio = False
        if line == General.etiquetaPinesFin:
            auxiliarPinesInicio = False
        if auxiliarPinesInicio == True:
            if line[:-1] != General.etiquetaPinesInicio and line[
                                                    :-1] != General.etiquetaPinesFin and line != General.etiquetaPinesFin:
                pinesJSON = pinesJSON + line[:-1] + ","
        if auxiliarInicio == True:
            if line[:-1] != General.etiquetaInicio and line[:-1] != General.etiquetaFin and line != General.etiquetaFin:
                mensajeJson = mensajeJson + line[:-1] + ","
        if auxiliarModuloInicio == True:
            if line[:-1] != General.etiquetaModuloInicio and line[
                                                     :-1] != General.etiquetaModuloFin and line != General.etiquetaModuloFin:
                moduloJSON = moduloJSON + line[:-1] + ","
    pinesJSON = pinesJSON[:-2] + "}"
    mensajeJson = mensajeJson[:-1] + "}"
    moduloJSON = moduloJSON[:-4] + "]"
    if contadorInicio == 2:
        _versionFirmware.pinesJSON = pinesJSON
        _versionFirmware.propiedadesJSON = mensajeJson
        _versionFirmware.modulosJSON = moduloJSON
        _versionFirmware.save()
        if idioma == 'ES':
            mensaje = "se ha Registrado correctamente el Firmware"
        else:
            mensaje = 'The Firmware has been successfully registered'
        dict = {
            "codError": "0000",
            "mensaje": mensaje
        }
    else:
        _versionFirmware.delete()
        if idioma == 'ES':
            mensaje = "No se ha registrado el Firmware, Por Favor Revise el Archivo"
        else:
            mensaje = 'You have not registered the Firmware, Please Check the File'
        dict = {
            "codError": "1111",
            "mensaje": mensaje
        }
    return dict
@csrf_exempt
def getListFirmwareTodosActivos(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _version_firmware = VersionFirmware.objects.filter(estado=True)
                _listafirmware = [{'pk': i.pk,
                                   'nombre': i.firmware.nombre,
                                   'version': i.version,
                                   'archivo': i.archivo.url,
                                   'propiedadesJSON': i.propiedadesJSON,
                                   'modulosJSON': i.modulosJSON,
                                   'pinJSON': i.pinesJSON,
                                   'estado': False
                                   } for i in _version_firmware]
                dict = {
                    "listaFirmware": _listafirmware,
                    "codError": "0000"
                }
            except:
                if idioma == 'ES':
                    mensaje = 'No se encuentra el Nombre del firmware dentro de la Línea Comando'
                else:
                    mensaje = 'The Firmware Name is not found inside the Command Line'
                dict = {
                    "codError": "1111",
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def getListFirmwareActivos(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _proyecto = Proyecto.objects.get(pk=request.POST['proyectoCompilador'])
                _firmware = Firmware.objects.filter(tipoProyectoCompilador=_proyecto)
                _version_firmware = VersionFirmware.objects.filter(firmware=_firmware, estado=True)
                _listafirmware = [{'pk': i.firmware.id,
                                   'nombre': i.firmware.nombre,
                                   'lenguaje': i.firmware.lenguaje,
                                   'version': i.version,
                                   'icono': i.firmware.icono.url,
                                   'archivo': i.archivo.url,
                                   'proyecto': i.firmware.tipoProyectoCompilador.nombreCarpeta,
                                   'estado': i.estado,
                                   'firmwarePK':i.firmware.pk,
                                   'versionPK':i.pk

                                   } for i in _version_firmware]
                dict = {
                    "listaFirmware": _listafirmware,
                    "codError": "0000"
                }
            except:
                if idioma == 'ES':
                    mensaje = 'No se encuentra el Nombre del firmware dentro de la Línea Comando'
                else:
                    mensaje = 'The Firmware Name is not found inside the Command Line'
                dict = {
                    "codError": "1111",
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def getListFirmwareMinimoActivos(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _firmware = Firmware.objects.all()

                _version_firmware = VersionFirmware.objects.filter(firmware=_firmware, estado=True)
                _listafirmware = [{'pk': i.firmware.id,
                                   'nombre': i.firmware.nombre,
                                   'version': i.version,
                                   'modulos': i.modulosJSON,
                                   } for i in _version_firmware]
                dict = {
                    "listaFirmware": _listafirmware,
                    "codError": "0000"
                }
            except:
                if idioma == 'ES':
                    mensaje = 'No se encuentra el Nombre del firmware dentro de la Línea Comando'
                else:
                    mensaje = 'The Firmware Name is not found inside the Command Line'
                dict = {
                    "codError": "1111",
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')


@csrf_exempt
def getListFirmwareIncluirInactivos(request):
    if request.user.is_authenticated():
        idioma = request.user.persona.idioma
        if request.is_ajax():
            try:
                _proyecto = Proyecto.objects.get(pk=request.POST['proyectoCompilador'])
                _firmware = Firmware.objects.filter(tipoProyectoCompilador=_proyecto)
                _version_firmware = VersionFirmware.objects.filter(firmware=_firmware)
                _listafirmware = [{'pk': i.firmware.id,
                                   'nombre': i.firmware.nombre,
                                   'lenguaje': i.firmware.lenguaje,
                                   'version': i.version,
                                   'icono': i.firmware.icono.url,
                                   'archivo': i.archivo.url,
                                   'proyecto': i.firmware.tipoProyectoCompilador.nombreCarpeta,
                                   'estado': i.estado
                                   } for i in _version_firmware]
                dict = {
                    "listaFirmware": _listafirmware,
                    "codError": "0000"
                }
            except:
                if idioma == 'ES':
                    mensaje = 'No se encuentra el Nombre del firmware dentro de la Línea Comando'
                else:
                    mensaje = 'The Firmware Name is not found inside the Command Line'
                dict = {
                    "codError": "1111",
                    "mensaje": mensaje
                }
            data_json = json.dumps(dict)
            return HttpResponse(data_json, content_type="aplication/json")
    else:
        return redirect('/')