#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
from numpy import savetxt

def make_flat(liste):
    new_liste=[]
    for elem in liste :
        if type(elem)==list:
            elem_flat=make_flat(elem)
            new_liste+=elem_flat
        else :
            new_liste.append(elem)
    return new_liste

def timedarray2array(t_array,tmax,dt):
    t,ind=0*second,0
    res_array=zeros((int(tmax/dt),1))
    while t<tmax:
        res_array[ind]=t_array(t)
        t+=dt
        ind+=1
    return res_array
    
def send_file(liste_fichiers,sprouting,lesion,cell_loss):
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.base import MIMEBase
    from email import encoders
    
    fromaddr = "amelie.aussel.pro@gmail.com"
    toaddr = "amelaussel@yahoo.fr"
    
    msg = MIMEMultipart()
    
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Resultat de la simulation "+str(liste_fichiers[0])+" sur LabLady"
    
    body = "Parametres :\n sprouting=%.2f \n lesion=%s \n cell_loss=%.2f " %(sprouting,lesion,cell_loss)
    
    msg.attach(MIMEText(body, 'plain'))
    
    for fichier in liste_fichiers:
        filename = fichier
        #print(fichier)
        attachment = open(fichier, "rb")
        
        part = MIMEBase('application', 'octet-stream')
        part.set_payload((attachment).read())
        encoders.encode_base64(part)
        #print("filename= %s" % str(filename))
        part.add_header('Content-Disposition', "attachment; filename= %s" % str(filename))
        
        msg.attach(part)
    
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(fromaddr, "Coton2694")
    text = msg.as_string()
    server.sendmail(fromaddr, toaddr, text)
    server.quit()  


def save_pos(types,all_pos,path):
    os.mkdir(path+'/positions')
    zone_names=['EC','DG','CA3','CA1']
    if types[0]==1 and types[1]==1:
        types_names=['exc','inh']
    elif types[0]==2 and types[1]==1:
        types_names=['exc1','exc2','inh']
    elif types[0]==1 and types[1]==2:
        types_names=['exc','inh1','inh2']
    else :
        types_names=['exc1','exc2','inh1','inh2']
        
    for region in range(4):
        for i_type in range(types[0]+types[1]):
            pos_file=open(path+'/positions/positions_'+zone_names[region]+'_'+types_names[i_type]+'.txt','w')
            for elem in all_pos[region][i_type] :
                pos_file.write(str(elem))
                pos_file.write(',')
                pos_file.write('\n')
            pos_file.close()
            
def save_dir(types,all_dir,path):
    os.mkdir(path+'/directions')
    zone_names=['EC','DG','CA3','CA1']
    if types[0]==1 and types[1]==1:
        types_names=['exc','inh']
    elif types[0]==2 and types[1]==1:
        types_names=['exc1','exc2','inh']
    elif types[0]==1 and types[1]==2:
        types_names=['exc','inh1','inh2']
    else :
        types_names=['exc1','exc2','inh1','inh2']
        
    for region in range(4):
        for i_type in range(types[0]+types[1]):
            pos_file=open(path+'/directions/directions_'+zone_names[region]+'_'+types_names[i_type]+'.txt','w')
            for elem in all_dir[region][i_type] :
                pos_file.write(str(elem))
                pos_file.write(',')
                pos_file.write('\n')
            pos_file.close()


def save_raster(types,all_raster_i_exc,all_raster_i_inh,all_raster_t_exc,all_raster_t_inh,path):
    print('Saving rasters')
    os.mkdir(path+'/rasters')
    zone_names=['EC','DG','CA3','CA1']
    if types[0]==1 and types[1]==1:
        types_names=['exc','inh']
    elif types[0]==2 and types[1]==1:
        types_names=['exc1','exc2','inh']
    elif types[0]==1 and types[1]==2:
        types_names=['exc','inh1','inh2']
    else :
        types_names=['exc1','exc2','inh1','inh2']
        
    for region in [0,1,2,3]:
        for i_type in range(types[0]):
            raster_file=open(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[i_type]+'_i.txt','w')
            for subraster in all_raster_i_exc[region][i_type] :
                for elem in subraster:
                    #print(elem)
                    raster_file.write(str(elem)+',')
            raster_file.close()
            #savetxt(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[i_type]+'_i.txt', all_raster_i_exc[region][i_type], delimiter=',')
            raster_file=open(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[i_type]+'_t.txt','w')
            for subraster in all_raster_t_exc[region][i_type] :
                for elem in subraster:
                    raster_file.write(str(elem)+',')
            raster_file.close()
            #savetxt(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[i_type]+'_t.txt', all_raster_t_exc[region][i_type], delimiter=',')
        for i_type in range(types[1]):
            raster_file=open(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[types[0]+i_type]+'_i.txt','w')
            for subraster in all_raster_i_inh[region][i_type] :
                for elem in subraster:
                    raster_file.write(str(elem)+',')
            raster_file.close()
            #savetxt(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[types[0]+i_type]+'_i.txt', all_raster_i_inh[region][i_type], delimiter=',')
            raster_file=open(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[types[0]+i_type]+'_t.txt','w')
            for subraster in all_raster_t_inh[region][i_type] :
                for elem in subraster:
                    raster_file.write(str(elem)+',')
            raster_file.close()
            #savetxt(path+'/rasters/raster_'+zone_names[region]+'_'+types_names[types[0]+i_type]+'_t.txt', all_raster_t_inh[region][i_type], delimiter=',')
    return

def save_syn(CA1_EcI,CA1_IEc,CA1_II,CA3_EcI,CA3_IEc,CA3_EcEc,EC_EcI,EC_IEc,DG_EI,DG_IE,ECc_DG_E,ECc_DG_I,ECc_CA3c_E,ECc_CA3_I,ECc_CA1c_E,ECc_CA1_I,DG_CA3c_E,DG_CA3_I,CA3c_CA1c_E,CA3c_CA1_I,CA1c_ECc_E,CA1c_EC_I):
    
    syn_file=open('syn_CA1_EI.txt','w')
    for elem in CA1_EcI.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA1_EcI.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')          
    syn_file.close()
    
    syn_file=open('syn_CA1_IE.txt','w')
    for elem in CA1_IEc.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA1_IEc.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()

    syn_file=open('syn_CA1_II.txt','w')
    for elem in CA1_II.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA1_II.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()
    
    
    syn_file=open('syn_CA3_EI.txt','w')
    for elem in CA3_EcI.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA3_EcI.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_CA3_IE.txt','w')
    for elem in CA3_IEc.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA3_IEc.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()

    syn_file=open('syn_CA3_EE.txt','w')
    for elem in CA3_EcEc.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA3_EcEc.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()    
    
    
    syn_file=open('syn_EC_EI.txt','w')
    for elem in EC_EcI.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in EC_EcI.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_EC_IE.txt','w')
    for elem in EC_IEc.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in EC_IEc.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()
    

    syn_file=open('syn_DG_EI.txt','w')
    for elem in DG_EI.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in DG_EI.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_DG_IE.txt','w')
    for elem in DG_IE.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in DG_IE.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()

 
    syn_file=open('syn_EC_E_DG_E.txt','w')
    for elem in ECc_DG_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_DG_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_EC_E_DG_I.txt','w')
    for elem in ECc_DG_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_DG_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()    
    
    syn_file=open('syn_EC_E_CA3_E.txt','w')
    for elem in ECc_CA3c_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_CA3c_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_EC_E_CA3_I.txt','w')
    for elem in ECc_CA3_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_CA3_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()      

    
    syn_file=open('syn_EC_E_CA1_E.txt','w')
    for elem in ECc_CA1c_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_CA1c_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_EC_E_CA1_I.txt','w')
    for elem in ECc_CA1_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in ECc_CA1_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close() 
    
    syn_file=open('syn_DG_E_CA3_E.txt','w')
    for elem in DG_CA3c_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in DG_CA3c_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_DG_E_CA3_I.txt','w')
    for elem in DG_CA3_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in DG_CA3_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()   
    
    syn_file=open('syn_CA3_E_CA1_E.txt','w')
    for elem in CA3c_CA1c_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA3c_CA1c_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_CA3_E_CA1_I.txt','w')
    for elem in CA3c_CA1_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA3c_CA1_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()    
    
    syn_file=open('syn_CA1_E_EC_E.txt','w')
    for elem in CA1c_ECc_E.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA1c_ECc_E.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',')         
    syn_file.close()
    
    syn_file=open('syn_CA1_E_EC_I.txt','w')
    for elem in CA1c_EC_I.i:
        syn_file.write(str(int(elem)))
        syn_file.write(',')
    syn_file.write('\n')  
    for elem in CA1c_EC_I.j:
        syn_file.write(str(int(elem)))
        syn_file.write(',') 
    syn_file.close()   
    

def save_params(liste_params,liste_params_names,path):
    param_file=open(path+'/parameters.txt','w')
    for i in range(len(liste_params)):
        param_file.write(liste_params_names[i]+': '+str(liste_params[i]))
        param_file.write('\n')
    param_file.close()
 
    
def ecriture_FR(nom,data,path): 
#    print(data)
    time_series=open(path+'/'+nom+'.txt','w')
    time_series.write('[')
    for n in data:
        time_series.write('%.2E,'%n)
    time_series.write(']\n')
    time_series.close()  
    
def save_FR(types,data_exc,data_inh,path,save_all_FR):
#    print(data_exc)
    os.mkdir(path+'/FR')
    
    if save_all_FR:
        zone_names=['EC','DG','CA3','CA1']
        if types[0]==1 and types[1]==1:
            types_names=['exc','inh']
        elif types[0]==2 and types[1]==1:
            types_names=['exc1','exc2','inh']
        elif types[0]==1 and types[1]==2:
            types_names=['exc','inh1','inh2']
        else :
            types_names=['exc1','exc2','inh1','inh2']
            
        for j in range(4):
            for i in range(types[0]):
    #            print(data_exc[j][i])
                ecriture_FR('FR_'+zone_names[j]+'_'+types_names[i],data_exc[j][i],path+'/FR')
            for i in range(types[1]):
                ecriture_FR('FR_'+zone_names[j]+'_'+types_names[i+types[0]],data_inh[j][i],path+'/FR')
    else :
        zone_names=['CA1']
        if types[0]==1:
            types_names=['exc']
        else :
            types_names=['exc1','exc2']
            
        for i in range(types[0]):
            ecriture_FR('FR_'+zone_names[0]+'_'+types_names[i],data_exc[0][i],path+'/FR')