#!/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
sys.path.append(os.getcwd())

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

from da.tools.initexit import start_logger, validate_opts_args, parse_options, CycleControl 
from da.tools.pipeline import ensemble_smoother_pipeline, header, footer
from da.platform.huygens import HuygensPlatform 
from da.carbondioxide.dasystem import CO2DaSystem 
from da.carbondioxide.optimizer import CO2Optimizer
from da.carbondioxide.obspack_geocarbon import ObsPackObservations
#from da.carbondioxide.statevector import CO2StateVector 
from da.co2gridded.statevector import CO2GriddedStateVector 
#from da.carbondioxide.obspack import ObsPackObservations 
#from da.carbondioxide.obs import CO2Observations 
from da.tm5.observationoperator import TM5ObservationOperator 

from da.analysis.expand_fluxes import save_weekly_avg_1x1_data, save_weekly_avg_state_data, save_weekly_avg_tc_data, save_weekly_avg_ext_tc_data 
from da.analysis.expand_mixingratios import write_mixing_ratios
from da.analysis.summarize_obs import summarize_obs

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

start_logger()
opts, args = parse_options()
opts, args = validate_opts_args(opts, args)

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

DaCycle = CycleControl(opts, args)

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


Platform = HuygensPlatform()
DaSystem = CO2DaSystem(DaCycle['da.system.rc'])
ObsOperator = TM5ObservationOperator(DaCycle['da.obsoperator.rc'])
Samples = ObsPackObservations()
#Samples     = CtObservations()
StateVector = CO2GriddedStateVector()
Optimizer = CO2Optimizer()

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



logging.info(header + "Entering Pipeline " + footer) 

ensemble_smoother_pipeline(DaCycle, Platform, DaSystem, Samples, StateVector, ObsOperator, Optimizer)


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

logging.info(header + "Starting analysis" + footer) 

save_weekly_avg_1x1_data(DaCycle, StateVector)
save_weekly_avg_state_data(DaCycle, StateVector)
save_weekly_avg_tc_data(DaCycle, StateVector)
save_weekly_avg_ext_tc_data(DaCycle)
write_mixing_ratios(DaCycle)
summarize_obs(DaCycle)

sys.exit(0)