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

import os
import sys
import math

sys.path.extend(["..","../channels/"])

from NaChannel import *
from KFastChannel import *
from KSlowChannel import *
from CaLChannel import *
from KAChannel import *
## use KCaChannel instead of KCaMPIChannel, in a non-MPI i.e. non-parallel run,
## to generate the KCaA.dat and KCaB.dat files.
#from KCaChannel import *
from KCaMPIChannel import *
## use KCaChannel_PG instead of KCaMPIChannel_PG, in a non-MPI i.e. non-parallel run,
## to generate the KCaA_PG.dat and KCaB_PG.dat files.
#from KCaChannel_PG import *
from KCaMPIChannel_PG import *
from CaPool import *
from KMChannel import *
from CaTChannel import *

from NaMitChannelMS import *
from KAChannelMS import *
from KDRChannelMS import *

import moose
from moose.neuroml import *

FARADAY = 96154.0 # Coulombs # from cadecay.mod : 1/(2*96154.0) = 5.2e-6 which is the Book of Genesis / readcell value
#FARADAY = 96485.3415 # Coulombs # from Wikipedia

def load_channels():
    # Na channels in /library should be called *Na* not *na*. No other channel should have Na in its name.
    # I search later for Na channels by string *Na*
    NaChannel("/library/Na_mit_usb")
    KFastChannel("/library/K2_mit_usb") ## CAUTION: K2 is Kfast
    KSlowChannel("/library/K_mit_usb") ## CAUTION: K is Kslow
    CaLChannel("/library/LCa3_mit_usb") # L-type Ca channel (high threshold)
    KAChannel("/library/KA_bsg_yka")
    KCaChannel("/library/Kca_mit_usb")
    KCaChannel_PG("/library/Kca_mit_usb_pg")
    CaPool("/library/Ca_mit_conc")
    KMChannel("/library/KM_bsg_upi")
    CaTChannel("/library/TCa_rat_ag") # T-type Ca channel (low threshold)
    # NaMitChannelMS(sh, Vna, MOOSEpathname)
    # mit Na and gran Na channels are different in sh and ENa. 
    NaMitChannelMS(10e-3, 50e-3, "/library/Na_mit_ms")
    NaMitChannelMS(0e-3, 50e-3, "/library/Na_mit_initialsegment_ms")
    # for Granule cell, maintaining the old name Na_rat_ms to avoid changing .p file (now invalid argument!),
    # even though this Na channel for granule cell is from Migliore and Shepherd 2008
    NaMitChannelMS(15e-3, 60e-3, "/library/Na_rat_ms")
    KAChannelMS("/library/KA_ms")
    KDRChannelMS("/library/KDR_ms")
    #self.context.readNeuroML(../channels/IhChannel.xml,"/library/Ih_cb")
    CML = ChannelML({'temperature':CELSIUS})
    CML.readChannelMLFromFile('../channels/Ih_cb.xml')
    CML.readChannelMLFromFile('../channels/TCa_d.xml')
    ## extras from neuroConstruct examples
    #CML.readChannelMLFromFile('../channels/CaHVA_Chan.xml')
    #CML.readChannelMLFromFile('../channels/CaL_Chan.xml')

def connect_CaConc(compartment_list):
    context = moose.PyMooseBase.getContext()
    #### Connect the Ca pools and channels
    #### Ca channels should have an extra field called 'ion' defined and set in MOOSE.
    #### Ca dependent channels like KCa should have an extra field called 'ionDependency' defined and set in MOOSE.
    #### Am connecting these at the very end so that all channels and pools have been created
    for compartment in compartment_list:
        if context.exists(compartment.path+'/Ca_mit_conc'): # Ca Pool
            caconc = moose.CaConc(compartment.path+'/Ca_mit_conc')
            for child in compartment.getChildren(compartment.id):
                neutralwrap = moose.Neutral(child)
                if neutralwrap.className == 'HHChannel':
                    channel = moose.HHChannel(child)
                    ### If 'ion' field is not present, the Shell returns '0', cribs and prints out a message but it does not throw an exception
                    if channel.getField('ion') == 'Ca':
                        channel.connect('IkSrc',caconc,'current')
                        #print 'Connected ',channel.path
                if neutralwrap.className == 'HHChannel2D':
                    channel = moose.HHChannel2D(child)
                    ### If 'ionDependency' field is not present, the Shell returns '0', cribs and prints out a message but it does not throw an exception
                    if channel.getField('ionDependency') == 'Ca':
                        caconc.connect('concSrc',channel,'concen')
                        #print 'Connected ',channel.path