#!/usr/bin/env python

#################################################################################################
# First order of business is always to make all other python modules accessible through the path
#################################################################################################

import sys
import os
import logging
dummy = sys.path.append(os.getcwd())

#################################################################################################
# Next, import the tools needed to initialize a data assimilation cycle
#################################################################################################

from da.tools.initexit import StartLogger
from da.tools.initexit import ValidateOptsArgs
from da.tools.initexit import ParseOptions

#################################################################################################
# Parse and validate the command line options, start logging
#################################################################################################

dummy       = StartLogger()
opts, args  = ParseOptions()
opts,args   = ValidateOptsArgs(opts,args)

#################################################################################################
# Create the Cycle Control object for this job    
#################################################################################################

from da.tools.initexit import CycleControl

DaCycle     = CycleControl(opts,args)

###########################################################################################
### IMPORT THE APPLICATION SPECIFIC MODULES HERE, TO BE PASSED INTO THE MAIN PIPELINE!!! ##
###########################################################################################

from da.tools.pipeline import EnsembleSmootherPipeline
from da.platform.huygens import HuygensPlatForm 
from da.ct.dasystem import CtDaSystem 
#from da.ct.statevector import CtStateVector 
from da.ctgridded.statevector import CtGriddedStateVector 
#from da.ct.obspack import ObsPackObservations 
from da.ct.obspack_geocarbon import ObsPackObservations 
#from da.ct.obs import CtObservations 
from da.tm5.observationoperator import TM5ObservationOperator 
from da.ct.optimizer import CtOptimizer

PlatForm    = HuygensPlatForm()
DaSystem    = CtDaSystem(DaCycle['da.system.rc'])
ObsOperator = TM5ObservationOperator(DaCycle['da.obsoperator.rc'])
Samples     = ObsPackObservations()
#Samples     = CtObservations()
StateVector = CtGriddedStateVector()
Optimizer   = CtOptimizer()

##########################################################################################
################### ENTER THE PIPELINE WITH THE OBJECTS PASSED BY THE USER ###############
##########################################################################################

from da.tools.pipeline import header,footer

msg          = header+"Entering Pipeline "+footer      ; logging.info(msg) 

EnsembleSmootherPipeline(DaCycle,PlatForm, DaSystem, Samples,StateVector,ObsOperator,Optimizer)


##########################################################################################
################### All done, extra stuff can be added next, such as analysis
##########################################################################################

msg          = header+"Starting analysis"+footer      ; logging.info(msg) 


from da.analysis.expand_fluxes import SaveWeeklyAvg1x1Data
from da.analysis.expand_fluxes import SaveWeeklyAvgStateData
from da.analysis.expand_fluxes import SaveWeeklyAvgTCData
from da.analysis.expand_fluxes import SaveWeeklyAvgExtTCData
from da.analysis.expand_mixingratios import WriteMixingRatios
from da.analysis.summarize_obs import SummarizeObs

savedas      = SaveWeeklyAvg1x1Data(DaCycle, StateVector)
savedas      = SaveWeeklyAvgStateData(DaCycle, StateVector)
savedas      = SaveWeeklyAvgTCData(DaCycle, StateVector)
savedas      = SaveWeeklyAvgExtTCData(DaCycle)
savedas      = WriteMixingRatios(DaCycle)
savedas      = SummarizeObs(DaCycle)

sys.exit(0)