#!/usr/bin/env python

"""
build model executable
"""

import sys, os

_CIMEROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..","..","..","..")
sys.path.append(os.path.join(_CIMEROOT, "scripts", "Tools"))

from standard_script_setup import *
from CIME.buildlib         import parse_input
from CIME.case             import Case
from CIME.utils            import expect, run_cmd
from CIME.build            import get_standard_makefile_args

logger = logging.getLogger(__name__)

###############################################################################
def _main_func():
###############################################################################

    caseroot, _, _ = parse_input(sys.argv)

    logger.info("Building a single executable version of target coupled model")

    with Case(caseroot) as case:
        casetools = case.get_value("CASETOOLS")
        cimeroot  = case.get_value("CIMEROOT")
        gmake     = case.get_value("GMAKE")
        gmake_j   = case.get_value("GMAKE_J")
        num_esp   = case.get_value("NUM_COMP_INST_ESP")
        ocn_model = case.get_value("COMP_OCN")
        atm_model = case.get_value("COMP_ATM")
        gmake_opts = get_standard_makefile_args(case)
        blddir = os.path.join(case.get_value("EXEROOT"),"cpl","obj")
        
    if ocn_model == 'mom' or atm_model == "ufsatm":
        gmake_opts += "USE_FMS=TRUE"


    expect((num_esp is None) or (int(num_esp) == 1), "ESP component restricted to one instance")


    with open(os.path.join(blddir,'Filepath'), 'w') as out:
        out.write(os.path.join(caseroot, "SourceMods", "src.drv") + "\n")
        out.write(os.path.join(cimeroot, "src", "drivers", "mct", "main") + "\n")

    # build model executable

    makefile = os.path.join(casetools, "Makefile")
    exename = os.path.join(case.get_value("EXEROOT"), case.get_value("MODEL") + ".exe")

    cmd = "{gmake} exec_se -j {gmake_j} EXEC_SE={exename} MODEL=driver {gmake_opts} -f {makefile} ".format(gmake=gmake, gmake_j=gmake_j, exename=exename,
                                                                                                           gmake_opts=gmake_opts, makefile=makefile)

    rc, out, _ = run_cmd(cmd, combine_output=True, from_dir=blddir)
    expect(rc==0,"Command %s failed rc=%d\nout=%s"%(cmd,rc,out))
    logger.info(out)

###############################################################################

if __name__ == "__main__":
    _main_func()
