import numpy as np
import genCurvas as gc
import motorcad as mc
import os

def log(msg):
    rutaLog = "results/log.txt"
    
    with open(rutaLog, 'a') as f:
        f.write(msg + '\n')
    print(msg)

if __name__ == '__main__':
    
    os.system('cls')
    archivoEnsayos = "Ensayos.xlsx"
    archivoCurvas = "PLACond.mdb"
    material = "PLACond"
    
    
    E_obj, f_obj = gc.valores_objetivo(archivoEnsayos, material)

    log(f"La tension inducida objetivo son {E_obj} V")
    
    offset = 0
     
    errorObjetivo = 0.01

    flag = False
    iteration = 0

    while flag == False:

        vTension = []

        gc.generar_curva(offset, archivoCurvas)
        
        log("-----------------------")
        print(f"Iniciando iteración {iteration}")

        for i in np.arange(len(E_obj)):

            error = []

            corriente = 0
            frecuencia = f_obj[i]
            
            mcadIteration = f"{iteration}.{i}"
            print(f"Calculando punto de operación: {mcadIteration}")
        
            tension = mc.simularMCAD(corriente, frecuencia, material, mcadIteration)

            vTension.append(tension)

        vTension = np.array(vTension)

        error = vTension/E_obj

        error = np.mean(error)

        log(f"El resultado de la iteración {iteration} es:")
        log(f"- E_calculada = {vTension}")
        log(f"- E_obj = {E_obj}")
        log(f"- Error = {error}")

        flag, offset, delta = gc.logica_offset(offset, error, errorObjetivo)

        if flag:
            log(f'Offset final es de {offset}')
        else:
            log(f"La delta empleada para la siguiente iteración será {delta}")
            log(f"El offset total es de {offset}")

        iteration = iteration + 1