/**
 * @file ParmsPrecipAccumCalcIO.cc
 * @brief Source code for user defined parameters class
 */ 

#include <ConvWxIO/ParmApp.hh>
#include <ConvWxIO/Trigger.hh>
#include <ConvWx/ConvWxConstants.hh>
#include <ConvWxIO/InterfaceParm.hh>
#include <toolsa/LogStream.hh>
#include "Params.hh"
#include "ParmsPrecipAccumCalcIO.hh"

using std::vector;
using std::pair;
using std::string;



ParmsPrecipAccumCalcIO::ParmsPrecipAccumCalcIO()
{
}

ParmsPrecipAccumCalcIO::ParmsPrecipAccumCalcIO(int argc, char **argv)
{
  //
  // Params is a class of user defined parameters. Members of ParmsPrecipAccumCalcIO 
  // will be a superset of Params
  //
  Params params;

  if (!parmAppInit(params, argc, argv, Trigger::TRIGGER_NONE))
  {
    exit(PARMS_FAILURE);
  }

  //
  // Container for parameters for input dataset
  //
  vector<ParmFcst> fcstIn;

  //
  // Container for parameters for output dataset
  //
  vector<ParmFcst> fcstOut;

  //
  // Dataset parameters object
  // 
  ParmFcst a;

  a = ParmFcst("inputModel", "Forecast input", true);  
 
  fcstIn.push_back(a);

  a = ParmFcst("outputModel", "Forecast output", true);

  fcstOut.push_back(a);
  
  if (!InterfaceParm::loadConvWxParams(true, main, proj, fcstIn, fcstOut))
  {
    printf("Fatal..Problem with TDRP parameters\n");

    exit(PARMS_FAILURE);
  }
  
  parmAppFinish(params, main);

  //
  // Now assign class member values from tdrp params
  //
  for (int i = 0; i < params.ensembleMembers_n; i++)
  {
    //
    // Add ensemble member to inputs
    //
    ParmFcstIO ensMem(fcstIn[0]);

    ensMem.pUrl = ensMem.pUrl + "/" +
      params._ensembleMembers[i];

    modelInput.push_back(ensMem);

    modelUrls.push_back(ensMem.pUrl);
  }

  modelOut = fcstOut[0];
  
  //
  // Container for times in hours
  //
  vector <double> leadTimeHours = modelInput[0].getLtHours();

  for (int i = 0; i < static_cast<int>(leadTimeHours.size()); ++i)
  {
    //
    // Lead time seconds
    //
    int secs = static_cast<int>(leadTimeHours[i] * convWx::SECS_PER_HOUR);

    leadSeconds.push_back(secs);
  }


  modelOut = fcstOut[0];

  //
  // Three hour accumulation params
  //
  hr3AccumName = params.hr3AccumName;
  hr3AccumOutputDirTail =  params.hr3AccumOutputDirTail;

  //
  // Six hour accumulation params
  //
  hr6AccumName = params.hr6AccumName;

  if( params.outputDataType == Params::INT8)
  {
    outputDataType = INT8;
  }
  else if (params.outputDataType == Params::INT16)
  {
    outputDataType = INT16;
  }
  else
  {
    outputDataType = FLOAT32;
  }

  for (int i=0; i < params.extraDataFields_n; ++i)
  {
    extraDataFields.push_back(params._extraDataFields[i]);
  }
  

  hr3UlwrfName =  params.hr3UlwrfName;
  hr6UlwrfName  = params.hr6UlwrfName;
  
  forceAccumNonNegative = params.forceAccumNonNegative;

  numThreads = params.numThreads;

  for (int i=0; i<params.mdv_6hr_names_n; ++i)
  {
    pair<string,string> p(params._mdv_6hr_names[i].shortName,
			  params._mdv_6hr_names[i].longName);
    mdv6hrShortToLong.push_back(p);
  }

  for (int i=0; i<params.mdv_3hr_names_n; ++i)
  {
    pair<string,string> p(params._mdv_3hr_names[i].shortName,
			  params._mdv_3hr_names[i].longName);
    mdv3hrShortToLong.push_back(p);
  }

  string p = shortNameToLongName(6, hr6AccumName);
  if (p.empty())
  {
    LOG(ERROR) << "param file is bad";
    exit(-1);
  }
  longNames6hr.push_back(p);
  p = shortNameToLongName(6, hr6UlwrfName);
  if (p.empty())
  {
    LOG(ERROR) << "param file is bad";
    exit(-1);
  }
  longNames6hr.push_back(p);
  for (size_t i=0; i < extraDataFields.size(); i++)
  {
    p = shortNameToLongName(6, extraDataFields[i]);
    if (p.empty())
    {
      LOG(ERROR) << "param file is bad";
      exit(-1);
    }
    longNames6hr.push_back(p);
  }

  p = shortNameToLongName(3, hr3AccumName);
  if (p.empty())
  {
    LOG(ERROR) << "param file is bad";
    exit(-1);
  }
  longNames3hr.push_back(p);
  p = shortNameToLongName(3, hr3UlwrfName);
  if (p.empty())
  {
    LOG(ERROR) << "param file is bad";
    exit(-1);
  }
  longNames3hr.push_back(p);
  for (size_t i=0; i < extraDataFields.size(); i++)
  {
    p = shortNameToLongName(3, extraDataFields[i]);
    if (p.empty())
    {
      LOG(ERROR) << "param file is bad";
      exit(-1);
    }
    longNames3hr.push_back(p);
  }
}

ParmsPrecipAccumCalcIO::~ParmsPrecipAccumCalcIO()
{

}