import scipy.optimize as opt
from tools.wtFrac import *

def massebalanser(xlist):
    # _mea betyr 30%MEA-løsning,
    # _h2o betyr vanndamp

    m1, w1_mea, w1_h2o, w1_o2, w1_n2, w1_co2,\
    m2, w2_mea, w2_h2o, w2_o2, w2_n2, w2_co2,\
    m3, w3_mea, w3_h2o, w3_o2, w3_n2, w3_co2,\
    m4, w4_mea, w4_h2o, w4_o2, w4_n2, w4_co2,\
    m5, w5_mea, w5_h2o, w5_o2, w5_n2, w5_co2,\
    m6, w6_mea, w6_h2o, w6_o2, w6_n2, w6_co2,\
    m7, w7_mea, w7_h2o, w7_o2, w7_n2, w7_co2,\
    m8, w8_mea, w8_h2o, w8_o2, w8_n2, w8_co2,\
    m9, w9_mea, w9_h2o, w9_o2, w9_n2, w9_co2 \
        = xlist
######################################################
    #definerer kjente variable
    
    #Strom 1
    d1M = m1 - 850
    d1c = w1_co2 - (wc1)
    d1h = w1_h2o - wh1
    d1o = w1_o2 - wo1
    d1n = w1_n2 - (wn1)
    d1m = w1_mea - 0
    
    #Strom 2
    d2m = w2_mea - 0
    
    #Strom 3
    d3c = w3_co2 - getWtFracCO2(alpha3)
    d3h = w3_h2o - 0
    d3o = w3_o2 - 0
    d3n = w3_n2 - 0
    
    #Strom 4
    d4c = w4_co2 - getWtFracCO2(alpha4)
    d4h = w4_h2o - 0
    d4o = w4_o2 - 0
    d4n = w4_n2 - 0

    #Strom 5 = Strom 4 (mhp. massebalanser)
    d5c = w5_co2 - w4_co2
    d5h = w5_h2o - w4_h2o
    d5o = w5_o2 - w4_o2
    d5n = w5_n2 - w4_n2
    d5m = w5_mea - w4_mea

    #HStrom 6 = Strom 3 (mhp. massebalanser) 
    d6c = w6_co2 - w3_co2
    d6h = w6_h2o - w3_h2o
    d6n = w6_n2 - w3_n2
    d6o = w6_o2 - w3_o2
    d6m = w6_mea - w3_mea

    # HStrom 6 = Strom 3 (mhp. massebalanser) 
    d7c = w7_co2 - w3_co2
    d7h = w7_h2o - w3_h2o
    d7n = w7_n2 - w3_n2
    d7o = w7_o2 - w3_o2
    d7m = w7_mea - w3_mea
    
    #Anntar at strøm 8 kun består av h2o og co2
    fracList8 = mole_to_wtFrac([xc8, 1-xc8, 0, 0, 0])
    d8c = w8_co2 - fracList8[0]
    d8h = w8_h2o - fracList8[1]
    d8n = w8_n2 - fracList8[2]
    d8o = w8_o2 - fracList8[3]
    d8m = w8_mea - fracList8[4]

    d9c = w9_co2 - 1
    d9h = w9_h2o - 0
    d9o = w9_o2 - 0
    d9n = w9_n2 - 0
    d9m = w9_mea - 0

    ###############################
    # info om strømmer, m5 = m4, m6 = m3, summen av fraksjoner = 1
    eq1 = m5 - m4
    eq2 = m3 - m6
    eq3 = m3 - m7

    eq4 = 1 - (w4_co2 + w4_h2o + w4_o2 + w4_n2 + w4_mea)
    eq5 = 1 - (w3_co2 + w3_h2o + w3_o2 + w3_n2 + w3_mea)

    #################################
    # Massebalanser over Absorber

    ab1 = m1 * w1_co2 + m3 * w3_co2 - (m2 * w2_co2 + m4 * w4_co2)
    ab2 = m1 * w1_h2o + m3 * w3_h2o - (m2 * w2_h2o + m4 * w4_h2o)
    ab3 = m1 * w1_o2  + m3 * w3_o2  - (m2 * w2_o2  + m4 * w4_o2)
    ab4 = m1 * w1_n2  + m3 * w3_n2  - (m2 * w2_n2  + m4 * w4_n2)
    ab5 = m1 * w1_mea + m3 * w3_mea - (m2 * w2_mea + m4 * w4_mea)

    # CO2 capture rate
    ab6 = m2 * w2_co2 - ((1-wcapture)*m1*w1_co2)

    #################################
    # Massebalanser over stripper
    st1 = m5 * w5_co2 - (m6 * w6_co2 + m9 * w9_co2)
    st2 = m5 * w5_mea - (m6 * w6_mea + m9 * w9_mea)
    st3 = m8 * w8_co2 - m9 * w9_co2



    balance = [d1M, d1m, d1h, d1o, d1n, d1c,
               d2m,
               d3c, d3h, d3n, d3o,
               d4c, d4h, d4n, d4o,
               d5c, d5h, d5n, d5o, d5m,
               d6c, d6h, d6n, d6o, d6m,
               d7c, d7h, d7n, d7o, d7m,
               d8c, d8h, d8n, d8o, d8m,
               d9c, d9h, d9n, d9o, d9m,
               eq1, eq2, eq3, eq4, eq5,
               ab1, ab2, ab3, ab4, ab5, ab6,
               st1, st2, st3]

    return balance



def run(to_file = False, to_screen = True):
    Gname = \
        '''
        m1, w1_mea, w1_h2o, w1_o2, w1_n2, w1_co2,
        m2, w2_mea, w2_h2o, w2_o2, w2_n2, w2_co2,
        m3, w3_mea, w3_h2o, w3_o2, w3_n2, w3_co2,
        m4, w4_mea, w4_h2o, w4_o2, w4_n2, w4_co2,
        m5, w5_mea, w5_h2o, w5_o2, w5_n2, w5_co2,
        m6, w6_mea, w6_h2o, w6_o2, w6_n2, w6_co2,
        m7, w7_mea, w7_h2o, w7_o2, w7_n2, w7_co2,
        m8, w8_mea, w8_h2o, w8_o2, w8_n2, w8_co2,
        m9, w9_mea, w9_h2o, w9_o2, w9_n2, w9_co2'''

    Glist = \
        [300, 0, wh1, wo1, wn1, wc1,
         250, 0, 0.05, 0.1, 0.8, 0.1,
         350, 0.95, 0, 0, 0, 0.05,
         360, 0.90, 0, 0, 0, 0.1,
         360, 0.90, 0, 0, 0, 0.1,
         350, 0.95, 0, 0, 0, 0.05,
         350, 0.95, 0, 0, 0, 0.05,
         50, 0, 0.3, 0, 0, 0.7,
         40, 0, 0, 0, 0, 1]

    # løser massebalansene
    ans = opt.root(massebalanser, Glist).x

    ####################################################
    # alt under her er printing og lagring av data

    if to_screen:
        i = 0
        # skriver ut data på en pen måte
        for k, v in zip(Gname.split(','), ans):
            if k[0] != 'm':
                k += ' ' * (7 - len(k))

            val = str(round(v, 8))
            val += ' ' * (12 - len(val))

            print(k, ' : ', val, end='     ')
            i += 1
            if i == 6:
                print()
                i = 0


    if to_file:
        # lagrer data for senere bruk
        from tools import file_handler
        stromdata_dict = {}
        for k, v in zip(Gname.split(','), ans):
            stromdata_dict[k.strip()] = round(v, 2)
        filename = input('filename : ')
        file_handler.dict_to_file(filename, stromdata_dict)