import csv
import pprint
import json
import requests
import os
import sys
# esto funciona para agno, a+o y año

def parseKeyword(word):
    # politicas
    if word.lower() == 'hidrógeno en transporte minero' or word.lower() == 'hidrogeno en transporte minero':
        return "introduccion_hidrogeno_mineria"
    elif word.lower() == 'hidrógeno en camiones de transporte carga por carreteras':
        return "hidrogeno_camiones"
    elif word.lower() == 'hidrógeno en transporte aéreo':
        return "hidrogeno_aereo"
    elif word.lower() == 'hidrógeno en transporte marítimo':
        return "hidrogeno_maritimo"
    elif word.lower() == 'hidrógeno para usos motrices en industria y minería':
        return "hidrogeno_motrices"
    elif word.lower() == 'hidrógeno para usos térmicos en industria y minería':
        return "hidrogeno_termico"
    elif word.lower() == 'reemplazo de combustibles fósiles por gas natural en procesos térmicos':
        return "reemplazo_combustibles_procesos_term"
    elif word.lower() == 'sistemas solares térmicos en industria y minería':
        return "introduccion_energias_renovables"
    elif word.lower() == 'sistemas solares térmicos en sector residencial':
        return "solares_residencial"
    elif word.lower() == 'electrificación de usos motrices en industria y minería':
        return "electrificacion_industria_mineria"
    elif word.lower() == 'electrificación de calefacción en sector residencial':
        return "electrificacion_calefaccion_residencial"
    elif word.lower() == 'electrificación de cocción en sector residencial':
        return "electrificacion_coccion_mineria"
    elif word.lower() == 'electrificación de usos finales en sector comercial':
        return "electrificacion_final_comercial"
    elif word.lower() == 'eficiencia energética en transporte':
        return "eficiencia_energetica_transporte"
    elif word.lower() == 'eficiencia energética en industria y minería':
        return "eficiencia_energetica_industria_mineria"
    elif word.lower() == 'mejoras en la reglamentación térmica de viviendas':
        return "reglamentacion_termica_viviendas"
    elif word.lower() == 'fomento al transporte público':
        return "transporte_publico"
    elif word.lower() == 'transporte no motorizado':
        return "transporte_no_motorizado"
    elif word.lower() == 'teletrabajo':
        return "teletrabajo"
    elif word.lower() == 'electromovilidad vehículos livianos':
        return "electromovilidad"
    elif word.lower() == 'electromovilidad en taxis y colectivos':
        return "electromovilidad_taxis_y_colectivos"
    elif word.lower() == 'electromovilidad en buses':
        return "electromovilidad_buses"
    elif word.lower() == 'introducción de energías renovables en baja tensión':
        return "introduccion_er_baja_tension"
    elif word.lower() == 'retiro de centrales a carbón':
        return "retiro_centrales_carbon"
    ## Politicas end
    ## parametros generales
    elif word.lower() == 'tasa pib':
        return 'tasa_pib'
    elif word.lower() == 'baja':
        return '1'
    elif word.lower() == 'media':
        return '2'
    elif word.lower() == 'alta':
        return '3'
    ## parametros generales end
    ## indicadores
    elif word.lower() == 'emisiones netas de gei':
        return 'emisiones_netas'
    elif word.lower() == 'emisiones de gei':
        return 'emisiones_gei'
    elif word.lower() == 'intensidad emisiones':
        return 'intensidad_emisiones'
    elif word.lower() == 'demanda energía':
        return 'demanda_energia'
    elif word.lower() == 'demanda eléctrica':
        return 'demanda_electrica'
    elif word.lower() == 'generación eléctrica':
        return 'generacion'
    elif word.lower() == 'potencia instalada generación eléctrica':
        return 'potencia_instalada'
    elif word.lower() == 'factor de emisión red eléctrica':
        return 'factor_emision_red_electrica'
    ## indicadores end
    ## otros
    elif word.lower().lower() in ['activado']:
        return "enabled"
    elif word.lower().lower() in ['sí', 'si']:
        return True
    elif word.lower().lower() == 'no':
        return False
    elif word.lower().lower() == 'trayectoria':
        return "trayectoria"
    ## otros end
    else:
        return word.lower()

# Se tuvo que crear esto porque generacion electrica tambien es un indicador
# e internamente tienen distintos nombres para los instrumentos e indicadores
def parseIEOptions(word):
    if word.lower() == 'generación eléctrica':
        return 'Generación eléctrica'
    elif word.lower().lower() in ['activado']:
        return "enabled"
    elif word.lower().lower() in ['sí', 'si']:
        return True
    elif word.lower().lower() == 'no':
        return False
    elif word.lower().lower() == 'trayectoria':
        return "trayectoria"
    elif word.lower() == 'impuesto al carbono':
        return "impuesto_carbono"
    elif word.lower() == 'sistema de permisos transables':
        return "permisos_transables"
    elif word.lower() == 'trayectoria del spet':
        return "trayectoria"
    elif word.lower() == 'sectores':
        return "sectores"   
    elif word.lower() == 'umbral':
        return "umbral"
    elif word.lower() == 'offset':
        return "offset"
    else:
        return word


def parseData(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        data_list = list()
        section_found = False
        for row in reader:
            if row[0] == 'FIN Datos':
                break
            if section_found:
                row = [i for i in row if i] # eliminar los elementos vacios
                data_list.append(row)
            if row[0] == 'INICIO Datos':
                section_found = True
        data = [dict(zip(data_list[0],row)) for row in data_list]
        data.pop(0)
        ## guardar como diccionario
        s = json.dumps(data, ensure_ascii=False).replace('aÃ±o', 'año').replace('agno', 'año')
        return json.loads(s)

def parseIE(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        section_found = False
        IE = {}
        IE_name = ''
        prev_row = ['']
        for row in reader:
            if row[0] == 'FIN Instrumentos Económicos':
                break
            if section_found:
                row = [i for i in row if i] # eliminar los elementos vacios
                if row[0].lower() == "nombre:":
                   IE_name = row[1]
                   IE_name = parseIEOptions(IE_name)
                   IE[IE_name] = {} 
                if prev_row[0].lower() == "configuración:":
                    prev_row = prev_row[1:]
                    for i in range(len(prev_row)):
                        prev_row[i] = parseIEOptions(prev_row[i])
                        IE[IE_name][prev_row[i]] = parseIEOptions(row[i])
                prev_row = row 
            if row[0] == 'INICIO Instrumentos Económicos':
                section_found = True
        return IE

def parsePE(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        prev_row = ''
        section_found = False
        final_row = False
        for row in reader:
            if row[0].lower() == 'FIN Políticas Energéticas'.lower():
                break
            if section_found:
                row = [i for i in row if i] # eliminar los elementos vacios
                row = row[1:] #ignorar categorias
                if final_row:
                    PE = {}
                    for i in range(len(prev_row)):
                        prev_row[i] = parseKeyword(prev_row[i])
                        if row[i] == '0':
                            PE[prev_row[i]] = { "enabled": False }
                        else:
                            PE[prev_row[i]] = { "enabled": True, "trayectoria": int(row[i]) } 
                prev_row = row
                final_row = True
            if row[0].lower() == 'INICIO Políticas Energéticas'.lower():
                section_found = True
        return PE

def parsePG(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        prev_row = ''
        section_found = False
        final_row = False
        for row in reader:
            if row[0].lower() == 'FIN Parámetros Generales'.lower():
                break
            if section_found:
                row = [i for i in row if i] # eliminar los elementos vacios
                row = row[1:] #ignorar categorias
                if final_row:
                    PG = {}
                    for i in range(len(prev_row)):
                        prev_row[i] = parseKeyword(prev_row[i])
                        row[i] = parseKeyword(row[i])
                        try:
                            PG[prev_row[i]] = eval(row[i])
                        except NameError:
                            PG[prev_row[i]] = row[i]
                prev_row = row
                final_row = True
            if row[0].lower() == 'INICIO Parámetros Generales'.lower():
                section_found = True
        return PG
        
def parseIndicador(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            if row[0].lower() == 'indicador:':
                return parseKeyword(row[1])

def parseScenarioName(filename):
    with open(filename, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            if row[0].lower() == 'escenario:':
                return row[1]


def createRequest(filename):
    request = {}
    request["scenarios"] = parsePE(filename)
    request["scenarios"].update(parsePG(filename))
    request["scenarios"].update(parseIE(filename))
    request["scenarios"].update(parseIE(filename))
    request["data"] = parseData(filename)
    request["indicator"] = {"id": parseIndicador(filename) }
    # Valores Personalizados
    request["name"] = parseScenarioName(filename)
    return request

def uploadScenario(filename, url):
    request = createRequest(filename)
    response = requests.post(url, json=request)
    return response.status_code//100 == 2

def uploadFolder(path, url):
    for file in os.listdir(path):
        if file.endswith(".csv"):
            print("Subiendo {}...".format(file))
            uploadAttempt = uploadScenario(file, url)
            tries = 1
            while not uploadAttempt:
                print('Error al subir {}, intentando nuevamente...'.format(file))
                uploadAttempt = uploadScenario(file, url)
                tries +=1
                if tries>=5:
                    print("Error al subir el archivo {}, si este error continua porfavor verificar el formato del archivo.".format(file))
                    break
            if tries >= 5:
                continue
            else:
                print("{} subido correctamente".format(file))    


endpoint = 'http://localhost:8080/chartdata/create-safe'

if __name__ == "__main__":
    default_path = './'
    if len(sys.argv) == 2:
        file = sys.argv[1]
        print("Subiendo unico archivo {}...".format(file))
        uploadAttempt = uploadScenario(file, endpoint)
        tries = 1
        while not uploadAttempt:
            print('Error al subir {}, intentando nuevamente...'.format(file))
            uploadAttempt = uploadScenario(file, endpoint)
            tries +=1
            if tries>=5:
                print("Error al subir el archivo {}, si este error continua porfavor verificar el formato del archivo.".format(file))
                break
        if tries >= 5:
            exit()
        else:
            print("{} subido correctamente".format(file)) 
            exit()
    elif len(sys.argv) == 1:
        print("Subiendo todos los archivos de la carpeta actual '.'...")
        uploadFolder(default_path, endpoint)
        exit()
    else:
        print('Uso: Ejecutar "python script.py" teniendo script.py y los .csv en la misma carpeta o "python script.py <path de archivo a subir>".')
        exit()

pprint.pprint(createRequest('EscenarioA_Demanda_Electrica.csv'))
    
