class Strom(object):
    ant_strommer = 0

    def __init__(self, k=[], f=[], cpL = [], kompM =[], kompN = [], kompHf = [], kompHv = [],
                 m=1, n=1, H=0, cp=0, T=0, p=0):
        Strom.ant_strommer += 1

        self.name = self        #f.eks. n1,n2,n3...
        self.nr = Strom.ant_strommer

        self.cp = cp         #varmekapasitet til strømmen
        self.m = m          #massen til strømmen i (kg/s)
        self.n = n
        self.H = H          #entalpien til strømmen
        self.T = T          #Temperaturen til strømmen
        self.p = p          #trykket til strømmen
        
        self.f = f
        self.k = k

        try:
            self.cp = sum([f[i] * cpL[i] for i in range(len(k))])       #regner ut varmekapasitet til strømmen
        except IndexError:
            pass

        if not kompM:
            self.kompM = [m * f[i] for i in range(len(f))]
        if not kompN:
            self.kompN = [n * f[i] for i in range(len(f))]

        kompattr = [f,cpL, kompM, kompN, kompHf, kompHv]            #sørger for at alle listene har len = len(k)
        for i in range(len(kompattr)):
            if  len(kompattr[i]) < len(k):
                kompattr[i].extend([0 for x in range(len(k)-len(kompattr[i]))])

        self.kompList =[0 for x in range(len(k))]
        for i in range(len(k)):
            setattr(self,k[i],Komponent(f=f[i],cp=cpL[i], m=kompM[i], n=kompN[i], k=k[i], Hv=kompHv[i], Hf=kompHf[i], stromN = self.n)) #genererer objektene k[i]
            self.kompList[i] = getattr(self,k[i])

    def pi(self,komp):
        return (eval('self.' + komp).f)*self.p

    def frak(self, fraksjoner):
        self.f = fraksjoner
        self.kompM = [self.m * fraksjoner[i] for i in range(len(fraksjoner))]
        self.kompN = [self.n * fraksjoner[i] for i in range(len(fraksjoner))]
        for i in range(len(self.k)):
            self.kompList[i].f = fraksjoner[i]
            self.kompList[i].n = self.kompN[i]
            self.kompList[i].m = self.kompM[i]


class Komponent(Strom):
    def __init__(self, f=1, cp=0, m=1, n=1, k='', Hf=None, Hv=None, stromN = 1):
        super().__init__()

        self.name = k
        self.f = f
        self.cp = cp
        self.m = m
        self.n = n
        self.Hf = Hf
        self.Hv = Hv
        self.stromN = stromN

    def frak(self, f):
        self.f = f
        self.n = self.stromN * self.f

def mix(strom1, strom2):

    m = strom1.m + strom2.m
    n = strom1.n + strom2.n
    H = strom1.H + strom2.H
    cp = ((strom1.cp)*(strom1.n) + (strom2.cp)*(strom2.n))/n

    k = list(set(strom1.k + strom2.k))

    kompN = [0 for i in k]

    komp1 = strom1.k
    komp2 = strom2.k
    n1 = strom1.n
    n2 = strom2.n

    for i in range(len(k)):
        if k[i] in set(komp1) & set(komp2):
            kompN[i] = ((eval('strom1.' + k[i]).f * n1) + (eval('strom2.' + k[i]).f * n2))

        elif k[i] in komp1:
            kompN[i] = (eval('strom1.' + k[i]).f * n1)

        else:
            kompN[i] = (eval('strom2.' + k[i]).f * n2)

    return Strom(k=k, kompN=kompN, m=m, n=n, H=H, cp=cp)