/* Copyright (C) 2006-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Denis Bertini [committer], Volker Friese, Florian Uhlig */

/** @file CbmStsContFact.cxx
 ** @author Denis Bertini <d.bertini@gsi.de>
 ** @since 20.06.2005
 **/
#include "CbmStsContFact.h"

#include "CbmMcbm2018StsPar.h"       // for CbmMcbm2018StsPar
#include "CbmStsParSetModule.h"      // for CbmStsParSetModule
#include "CbmStsParSetSensor.h"      // for CbmStsParSetSensor
#include "CbmStsParSetSensorCond.h"  // for CbmStsParSetSensorCond
#include "CbmStsParSim.h"            // for CbmStsParSim

#include <FairParSet.h>     // for FairParSet
#include <FairRuntimeDb.h>  // for FairRuntimeDb
#include <Logger.h>         // for Logger, LOG

#include <TList.h>    // for TList
#include <TString.h>  // for TString

#include <string.h>  // for strcmp

ClassImp(CbmStsContFact)

  static CbmStsContFact gCbmStsContFact;


// -----   Constructor   ----------------------------------------------------
CbmStsContFact::CbmStsContFact()
{
  SetName("CbmStsContFact");
  SetTitle("STS parameter container factory");
  setAllContainers();
  FairRuntimeDb::instance()->addContFactory(this);
}
// --------------------------------------------------------------------------


// -----   Create a parameter set   -----------------------------------------
FairParSet* CbmStsContFact::createContainer(FairContainer* container)
{

  const char* contName = container->GetName();
  FairParSet* parSet   = nullptr;

  // --- Simulation settings
  if (strcmp(contName, "CbmStsParSim") == 0) {
    parSet = new CbmStsParSim(container->getConcatName().Data(), container->GetTitle(), container->getContext());
  }

  // --- Module parameters
  else if (strcmp(contName, "CbmStsParSetModule") == 0) {
    parSet = new CbmStsParSetModule(container->getConcatName().Data(), container->GetTitle(), container->getContext());
  }

  // --- Sensor parameters
  else if (strcmp(contName, "CbmStsParSetSensor") == 0) {
    LOG(info) << "createContainer " << container->getConcatName().Data() << " " << container->GetTitle() << " "
              << container->getContext();
    parSet = new CbmStsParSetSensor(container->getConcatName().Data(), container->GetTitle(), container->getContext());
    LOG(info) << "Done";
  }

  // --- Sensor conditions
  else if (strcmp(contName, "CbmStsParSetSensorCond") == 0) {
    parSet =
      new CbmStsParSetSensorCond(container->getConcatName().Data(), container->GetTitle(), container->getContext());
  }

  // --- Beamtime parameters
  else if (strcmp(contName, "CbmMcbm2018StsPar") == 0) {
    parSet = new CbmMcbm2018StsPar(container->getConcatName().Data(), container->GetTitle(), container->getContext());
  }

  LOG(info) << GetName() << ": Create container " << contName << " with parameter set " << parSet->GetName();
  return parSet;
}
// --------------------------------------------------------------------------


// ----   Define containers and contexts   ----------------------------------
void CbmStsContFact::setAllContainers()
{

  // --- Simulation settings
  FairContainer* simPars = new FairContainer("CbmStsParSim", "STS simulation settings", "Default");
  simPars->addContext("Default");
  containers->Add(simPars);

  // --- Module parameters
  FairContainer* modulePars = new FairContainer("CbmStsParSetModule", "STS module parameters", "Default");
  modulePars->addContext("Default");
  containers->Add(modulePars);

  // --- Sensor parameters
  FairContainer* sensorPars = new FairContainer("CbmStsParSetSensor", "STS sensor parameters", "Default");
  sensorPars->addContext("Default");
  containers->Add(sensorPars);

  // --- Sensor conditions
  FairContainer* sensorCond = new FairContainer("CbmStsParSetSensorCond", "STS sensor conditions", "Default");
  sensorCond->addContext("Default");
  containers->Add(sensorCond);

  // Beamtime parameters
  FairContainer* beamPars = new FairContainer("CbmMcbm2018StsPar", "STS at MCBM 2018 Unpack Parameters", "Default");
  beamPars->addContext("Default");
  containers->Add(beamPars);
}
// --------------------------------------------------------------------------