import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import json

def ensayo_vacio(V,f):

    '''
    Entrada:
        V = {
        'a': [datos]
        'b': [datos]
        'c': [datos]
        }

        f = [datos]
    
    Salida:
        ke media por fase
        ke por fase
    '''

    keA = []
    keB = []
    keC = []

    for i in range(len(f)):

        keA.append(V['a'][i]/f[i])
        keB.append(V['b'][i]/f[i])
        keC.append(V['c'][i]/f[i])
    
    keMedia = { 
        'a': np.mean(keA),
        'b' : np.mean(keB),
        'c' : np.mean(keC)
    }
    ke = { 
        'a': keA,
        'b' : keB,
        'c' : keC
    }

    return keMedia, ke

def ensayo_corto(I, f, ke, R):
    '''
    Entrada:
        I = {
        'a': [datos]
        'b': [datos]
        'c': [datos]
        }

        f = [datos]

        R = cte

    Salida:
        media induccion [mH]
        todas las inducciones
        coeficiente de variacion
    '''
    L = []
    for i in range(len(f)):
        xa = np.sqrt((ke['a']*f[i]/I['a'][i])**2 - R**2 )
        xb = np.sqrt((ke['b']*f[i]/I['b'][i])**2 - R**2 )
        xc = np.sqrt((ke['c']*f[i]/I['c'][i])**2 - R**2 )
        
        L.append(np.mean([xa,xb,xc]) / (2 * np.pi * f[i]) * 1e3)

    return np.mean(L), np.array(L), np.std(L)/np.mean(L)*100


def ensayo_carga(V, I, f, R, L):
    '''
    Entrada:
        V = {
        'a': [datos]
        'b': [datos]
        }

        I = {
        'a': [datos]
        'b': [datos]
        }

        f = [datos]

    '''
    E = []
    Ireal = []
    for i in range(len(f)):
        Vtemp = np.mean([V['a'][i], V['b'][i]])
        Itemp = np.mean([I['a'][i], I['b'][i]])

        Ireal.append(Itemp)
        E.append(np.sqrt((R + Vtemp/Itemp) ** 2 + (2*np.pi*f[i]*L*1e-3) ** 2) * Itemp)

        
    return np.array(E), np.array(Ireal)

def ensayar_material(resistencia, material, ruta):
    
    vacio = pd.read_excel(ruta, sheet_name='vacio', engine='openpyxl').dropna()
    corto = pd.read_excel(ruta, sheet_name='corto', engine='openpyxl').dropna()
    carga = pd.read_excel(ruta, sheet_name='carga', engine='openpyxl').dropna()

    tensionVacio = {
        'a' : np.array(vacio['V1'][vacio['material'] == material]),
        'b' : np.array(vacio['V2'][vacio['material'] == material]),
        'c' : np.array(vacio['V3'][vacio['material'] == material])
    }
    fVacio = np.array(vacio['f'][vacio['material'] == material])

    Emean = np.mean(np.array([tensionVacio['a'], tensionVacio['b'], tensionVacio['c']]), axis=0)

    return Emean, fVacio

    keMedia, ke = ensayo_vacio(tensionVacio, fVacio)

    corrienteCorto ={
        'a' : np.array(corto['I1'][corto['material'] == material]),
        'b' : np.array(corto['I2'][corto['material'] == material]),
        'c' : np.array(corto['I3'][corto['material'] == material])
    }
    fCorto = np.array(corto['f'][corto['material'] == material])

    lMedia, l, lCV = ensayo_corto(corrienteCorto, fCorto, keMedia, resistencia)

    tensionCarga = {
        'a' : np.array(carga['V1'][carga['material'] == material]),
        'b' : np.array(carga['V2'][carga['material'] == material])
    }
    corrienteCarga = {
        'a' : np.array(carga['I1'][carga['material'] == material]),
        'b' : np.array(carga['I2'][carga['material'] == material])
    }
    fCarga = np.array(carga['f'][carga['material'] == material])

    E, I = ensayo_carga(tensionCarga, corrienteCarga, fCarga, resistencia, lMedia)

    return E, I, fCarga
    

if __name__ == '__main__':
    archivo = 'Ensayos.xlsx'

    vacio = pd.read_excel(archivo, sheet_name='vacio', engine='openpyxl').dropna()
    corto = pd.read_excel(archivo, sheet_name='corto', engine='openpyxl').dropna()
    carga = pd.read_excel(archivo, sheet_name='carga', engine='openpyxl').dropna()


    resistencia = 4.5
    materiales = np.unique(vacio['material'])

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    for material in materiales:
        tensionVacio = {
            'a' : np.array(vacio['V1'][vacio['material'] == material]),
            'b' : np.array(vacio['V2'][vacio['material'] == material]),
            'c' : np.array(vacio['V3'][vacio['material'] == material])
        }
        fVacio = np.array(vacio['f'][vacio['material'] == material])

        keMedia, ke = ensayo_vacio(tensionVacio, fVacio)


        corrienteCorto ={
            'a' : np.array(corto['I1'][corto['material'] == material]),
            'b' : np.array(corto['I2'][corto['material'] == material]),
            'c' : np.array(corto['I3'][corto['material'] == material])
        }
        fCorto = np.array(corto['f'][corto['material'] == material])

        lMedia, l, lCV = ensayo_corto(corrienteCorto, fCorto, keMedia, resistencia)


        tensionCarga = {
            'a' : np.array(carga['V1'][carga['material'] == material]),
            'b' : np.array(carga['V2'][carga['material'] == material])
        }
        corrienteCarga = {
            'a' : np.array(carga['I1'][carga['material'] == material]),
            'b' : np.array(carga['I2'][carga['material'] == material])
        }
        fCarga = np.array(carga['f'][carga['material'] == material])

        E, I = ensayo_carga(tensionCarga, corrienteCarga, fCarga, resistencia, lMedia)

        ax.plot3D(I, fCarga, E, label = material)

    ax.set_xlabel('Corriente [A]')
    ax.set_ylabel('Frecuencia [Hz]')
    ax.set_zlabel('Tension [V]')

    Imax = np.max(I)
    Emax = np.max(E)
    fmax = np.max(fCarga)

    ax.set_xlim(0, Imax * 1.1)
    ax.set_ylim(0, fmax * 1.1)
    ax.set_zlim(0, Emax * 1.1)

    ax.legend()
    plt.show()