import numpy as np
import scipy.integrate
import constants as c

class Temp():
    def __init__(self,HR = 0.5,CR = 0.5,T_iso = 600, t_iso = 50):

        self.t_iso_start = (T_iso - c.T0) / HR
        self.t_iso_slutt = self.t_iso_start + t_iso
        self.t_end = self.t_iso_slutt + (T_iso - c.T0) / CR

        self.T_iso = T_iso
        self.HR = HR
        self.CR = CR
        self.t_iso = t_iso

    def __call__(self,t):
        if t < self.t_iso_start:
            self.temp = c.T0 + self.HR*t

        elif t < self.t_iso_slutt:
            self.temp = self.T_iso

        elif t <= self.t_end:
            self.temp = self.T_iso - self.CR*(t-self.t_iso_slutt)

        return self.temp

#Regner ut R etter kornvekst er ferdig, kan BARE ta inn tall, IKKE lister/arrays
#For å lage en liste fra funksjonen bruker du:
#x_verdier = np.linspace(start,slutt,antall_punkter)
#y_verdier = [R(HR = x, CR = CR, ...) for x in x_verdier]
#eller HR = HR, CR = x, T_iso = T_iso ...
#eller hvilken som helst annen du vil variere
def R(HR = 0.5, CR = 0.5, T_iso = 600, t_iso = 500, n = 0.5):
    #initialiserer temperaturfunksjonen med bestemt HR, CR, T_iso osv.
    temp = Temp(HR = HR,CR = CR,T_iso = T_iso, t_iso = t_iso)

    #Setter opp integranden
    integrand = lambda t: c.gamma * c.M0 * np.exp(-c.Q / (c.R_gas * temp(t)))

    #integrerer først frem til T = T_iso, så til slutt av T_iso, så hele veien
    #(0,t_iso_start), (0, t_iso_slutt), (0, t_slutt)
    integral_heating = scipy.integrate.quad(integrand,0,temp.t_iso_start)[0]
    integral_iso = integral_heating + scipy.integrate.quad(integrand,temp.t_iso_start,temp.t_iso_slutt)[0]
    integral_total = integral_iso + scipy.integrate.quad(integrand, temp.t_iso_slutt, temp.t_end)[0]

    R_heating = ((c.R0**(1/n) + integral_heating)**(1/n))*1e6
    R_iso = ((c.R0 ** (1 / n) + integral_iso) ** (1 / n))*1e6
    R_total = ((c.R0 ** (1 / n) + integral_total) ** (1 / n))*1e6

    return [R_heating, R_iso, R_total]