#!/usr/bin/env python
#in app_namePara create two files
#CMakeLists.txt

def MakePara(sfarm_dir, app_name):
    print "create file "+sfarm_dir+'/'+app_name+'/'+app_name+'Para'+"/CMakeLists.txt"
    fcmake=open(sfarm_dir+'/'+app_name+'/'+app_name+'Para'+"/CMakeLists.txt","w")
    fcmake.write("set("+app_name.upper()+"PARA_SOURCES\n")
    fcmake.write("  "+app_name+"ParaType.F90\n")
    fcmake.write( ")\n")

    fcmake.write("include_directories(${CMAKE_BINARY_DIR}/src/betr/betr_util)\n")
    fcmake.write("include_directories(${CMAKE_BINARY_DIR}/src/betr/betr_math)\n")
    fcmake.write("include_directories(${CMAKE_BINARY_DIR}/src/io_util)\n")
    fcmake.write("include_directories(${CMAKE_BINARY_DIR}/src/Applications/soil-farm/bgcfarm_util)\n")
    fcmake.write("include_directories(${CMAKE_BINARY_DIR}/src/Applications/soil-farm/"+app_name+"/"+app_name+"Para)\n")
    fcmake.write("include(add_betr_library)\n")
    fcmake.write("add_betr_library("+app_name+"Para ${"+app_name.upper()+"PARA_SOURCES})\n")

    fcmake.write("set(BETR_LIBRARIES "+app_name+"Para;${BETR_LIBRARIES} PARENT_SCOPE)\n")
    fcmake.write("set(BETR_LIBRARIES "+app_name+"Para;${BETR_LIBRARIES})\n")

    fcmake.write("if (NOT CMAKE_INSTALL_PREFIX STREQUAL "+'"'+"INSTALL_DISABLED"+'"'+")\n")
    fcmake.write("    install(TARGETS "+app_name+"Para DESTINATION lib)\n")
    fcmake.write("    file(GLOB HEADERS *.h)\n")
    fcmake.write("    install(FILES ${HEADERS} DESTINATION include/soil-farm/"+app_name+"/"+app_name+"Para)\n")
    fcmake.write("endif()\n")
    fcmake.close()
    print ""
    print "create file "+sfarm_dir+'/'+app_name+'/'+app_name+'Para'+"/"+app_name+"ParaType.F90"
#app_nameParaType.F90
    fpara=open(sfarm_dir+'/'+app_name+'/'+app_name+'Para'+"/"+app_name+"ParaType.F90","w")
    fpara.write("module "+app_name+"ParaType\n")
    fpara.write("use bshr_kind_mod   , only : r8 => shr_kind_r8\n")
    fpara.write("use BiogeoContype   , only : BiogeoCon_type\n")
    fpara.write("implicit none\n")
    fpara.write("\n")
    fpara.write("  private\n")
    fpara.write("  character(len=*), private, parameter :: filename = &\n")
    fpara.write("       __FILE__\n")

    fpara.write("  type, public :: "+app_name+"_para_type\n")
    fpara.write("  !declare variables here\n")
    fpara.write("\n")
    fpara.write("  contains\n")
    fpara.write("    procedure, public  :: Init     => "+app_name+"_para_Init\n")
    fpara.write("    procedure, public  :: readPars => "+app_name+"_para_readPars\n")
    fpara.write("    procedure, public  :: printPars=> "+app_name+"_para_printPars\n")
    fpara.write("    procedure, private :: "+app_name+"_InitAllocate\n")
    fpara.write("    procedure, private :: set_defpar_default\n")
    fpara.write("  end type "+app_name+"_para_type\n")
    fpara.write("\n")
    fpara.write("  type("+app_name+"_para_type), public :: "+app_name+"_para\n")
    fpara.write("  public :: create_jarpars_"+app_name+"\n")
    fpara.write("contains\n")
    fpara.write("\n")
    fpara.write("  function create_jarpars_"+app_name+"()\n")
    fpara.write("  ! DESCRIPTION\n")
    fpara.write("  ! constructor\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), pointer :: create_jarpars_"+app_name+"\n")
    fpara.write("  class("+app_name+"_para_type), pointer :: bgc\n")
    fpara.write("\n")
    fpara.write("  allocate(bgc)\n")
    fpara.write("  create_jarpars_"+app_name+" => bgc\n")
    fpara.write("\n")
    fpara.write("  end function create_jarpars_"+app_name+"\n")

    fpara.write(" !--------------------------------------------------------------------\n")
    fpara.write("  subroutine "+app_name+"_para_Init(this, bstatus)\n")
    fpara.write("  !\n")
    fpara.write("  !DESCRIPTION\n")
    fpara.write("  !initialize default parameters\n")
    fpara.write("\n")
    fpara.write("  use betr_constants , only : betr_namelist_buffer_size_ext\n")
    fpara.write("  use BetrStatusType , only : betr_status_type\n")
    fpara.write("  use betr_ctrl      , only : betr_spinup_state\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), intent(inout) :: this\n")
    fpara.write("  type(betr_status_type)       , intent(out) :: bstatus\n")
    fpara.write("\n")
    fpara.write("\n")
    fpara.write("  call this%"+app_name+"_InitAllocate"+"()\n")
    fpara.write("  call this%set_defpar_default()\n")
    fpara.write("\n")
    fpara.write("  end subroutine "+app_name+"_para_Init\n")
    fpara.write(" !--------------------------------------------------------------------\n")

    fpara.write("  subroutine "+app_name+"_InitAllocate"+"(this)\n")
    fpara.write("  use betr_varcon, only : betr_maxpatch_pft, betr_max_soilorder\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), intent(inout) :: this\n")
    fpara.write("  !allocate memory for necessary varaibles\n")
    fpara.write("\n")
    fpara.write("  end subroutine "+app_name+"_InitAllocate\n")

    fpara.write("  !--------------------------------------------------------------------\n")
    fpara.write("  subroutine set_defpar_default(this)\n")
    fpara.write("  !\n")
    fpara.write("  !DESCRIPTION\n")
    fpara.write("  !set default value for relevant parameters\n")
    fpara.write("  use tracer_varcon      , only : natomw,patomw\n")
    fpara.write("  use bshr_const_mod  , only : year_sec=>SHR_CONST_YEARSECS\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), intent(inout) :: this\n")
    fpara.write("\n")
    fpara.write("\n")
    fpara.write("  end subroutine set_defpar_default\n")

    fpara.write(" !--------------------------------------------------------------------\n")

    fpara.write("  subroutine "+app_name+"_para_readPars(this, ncid, bstatus)\n")
    fpara.write("  !\n")
    fpara.write("  !DESCRIPTION\n")
    fpara.write("  !read parameters from input file\n")
    fpara.write("  use bshr_log_mod    , only : errMsg => shr_log_errMsg\n")
    fpara.write("  use ncdio_pio       , only : file_desc_t, ncd_io\n")
    fpara.write("  use BetrStatusType  , only : betr_status_type\n")
    fpara.write("  use betr_ctrl       , only : betr_spinup_state\n")
    fpara.write("  use bshr_const_mod  , only : year_sec=>SHR_CONST_YEARSECS\n")
    fpara.write("  use tracer_varcon   , only : natomw,patomw\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), intent(inout) :: this\n")
    fpara.write("  type(file_desc_t)            , intent(inout) :: ncid  ! pio netCDF file id\n")
    fpara.write("  type(betr_status_type)       , intent(out)   :: bstatus\n")
    fpara.write("\n")
    fpara.write("  !local variables\n")
    fpara.write("  character(len=100) :: errCode = '-Error reading in parameters file:'\n")
    fpara.write("  logical            :: readv ! has variable been read in or not\n")
    fpara.write("  real(r8)           :: tempr(1) ! temporary to read in constant\n")
    fpara.write("  real(r8)           :: temparr(1:2,1:1)\n")
    fpara.write("  character(len=100) :: tString ! temp. var for reading\n")
    fpara.write("\n")
    fpara.write("  call bstatus%reset()\n")
    fpara.write("  return\n")
    fpara.write("\n")
    fpara.write("  end subroutine "+app_name+"_para_readPars\n")

    fpara.write("!--------------------------------------------------------------------\n")
    fpara.write("  subroutine "+app_name+"_para_printPars(this)\n")
    fpara.write("\n")
    fpara.write("  implicit none\n")
    fpara.write("  class("+app_name+"_para_type), intent(inout) :: this\n")
    fpara.write("\n")
    fpara.write("  end subroutine "+app_name+"_para_printPars\n")
    fpara.write("end module "+app_name+"ParaType\n")
    fpara.close()
