#ifndef HGEOMINTERFACE_H
#define HGEOMINTERFACE_H
#include "TObjArray.h"
#include "TList.h"
#include "TString.h"
class HGeomIo;
class HGeomSet;
class HGeomMedia;
class HGeomShapes;
class HGeomBuilder;
class HSpecGeomPar;
class HDetGeomPar;
enum EHGeoDetPart {
  kHGeomCave   =  0,
  kHGeomRich   =  1,
  kHGeomTarget =  2,
  kHGeomSect   =  3,
  kHGeomMdc    =  4,
  kHGeomCoils  =  5,
  kHGeomTof    =  6,
  kHGeomShower =  7,
  kHGeomFrames =  8,
  kHGeomStart  =  9,
  kHGeomFWall  = 10,
  kHGeomRpc    = 11,
  kHGeomEmc    = 12,
  kHGeomUser   = 13 };
class HGeomInterface : public TObject { 
  HGeomIo*      fileInput;   
  HGeomIo*      oraInput;    
  HGeomIo*      output;      
  Bool_t        addDateTime; 
  Int_t         nSets;       
  Int_t         nActualSets; 
  Int_t         nFiles;      
  TObjArray*    sets;        
  HGeomMedia*   media;       
  HGeomShapes*  shapes;      
  TList*        masterNodes; 
  TString       setupFile;   
  HGeomBuilder* geoBuilder;  
  TString       paramFile;   
public:
  HGeomInterface();
  ~HGeomInterface();
  void setOracleInput(HGeomIo* p) {oraInput=p;}
  void setOutput(HGeomIo* p, Bool_t fl=kTRUE) {output=p; addDateTime=fl;}
  void setGeomBuilder(HGeomBuilder* p) {geoBuilder=p;}
  HGeomIo* getFileInput() { return fileInput; }
  HGeomIo* getOraInput() { return oraInput; }
  HGeomIo* getOutput() { return output; }
  HGeomShapes* getShapes() { return shapes; }
  HGeomMedia* getMedia() { return media; }
  void addInputFile(const Char_t*);
  Bool_t addAlignment(HSpecGeomPar*);
  Bool_t addAlignment(HDetGeomPar*);
  void   adjustSecGeom(void);
  HGeomSet* findSet(const Char_t*);
  Bool_t readSet(HGeomSet*);
  Bool_t writeSet(HGeomSet*);
  Bool_t writeSet(HGeomSet*,const Char_t*);
  Bool_t writeSet(const Char_t* name,const Char_t* author,const Char_t* descr);
  Bool_t writeMedia(const Char_t* author,const Char_t* descr);
  Bool_t createSet(HGeomSet*);
  void deleteSet(HGeomSet* pSet);
  Bool_t readMedia();
  Bool_t writeMedia();
  Bool_t writeMedia(const Char_t*);
  Bool_t readAll();
  Bool_t writeAll();
  Bool_t createAll(Bool_t withCleanup=kFALSE);
  Bool_t createGeometry(Bool_t withCleanup=kFALSE);
  Bool_t readGeomConfig(const Char_t*);
  void addSetupFile(const Char_t* f) {setupFile=f;}
  Bool_t readSetupFile();
  void addParamFile(const Char_t* f) {paramFile=f;}
  void print();
private:
  HGeomIo* connectInput(const Char_t*);
  Bool_t   connectOutput(const Char_t*,TString pType="geo");
  void     shiftNode(Int_t set,const Char_t* name, Double_t zShift);
  void     shiftNode6sect(Int_t set,const Char_t* name, Double_t zShift);
  ClassDef(HGeomInterface,0) 
};
#endif /* !HGEOMINTERFACE_H */