
#ifndef FirstConfigure_h
#define FirstConfigure_h

#include <QWizard>
#include <QWizardPage>

#include "cmake.h"

#include "ui_Compilers.h"
#include "ui_CrossCompiler.h"

class QRadioButton;
class QComboBox;

//! the wizard pages we'll use for the first configure of a build
enum FirstConfigurePages
{
  Start,
  NativeSetup,
  ToolchainSetup,
  CrossSetup,
  Done
};

//! the first page that gives basic options for what compilers setup to choose
//! from
class StartCompilerSetup : public QWizardPage
{
  Q_OBJECT
public:
  StartCompilerSetup(QString defaultGeneratorPlatform,
                     QString defaultGeneratorToolset, QWidget* p);
  ~StartCompilerSetup();
  void setGenerators(std::vector<cmake::GeneratorInfo> const& gens);
  void setCurrentGenerator(const QString& gen);
  QString getGenerator() const;
  QString getToolset() const;
  QString getPlatform() const;

  bool defaultSetup() const;
  bool compilerSetup() const;
  bool crossCompilerSetup() const;
  bool crossCompilerToolChainFile() const;

  int nextId() const;

signals:
  void selectionChanged();

protected slots:
  void onSelectionChanged(bool);
  void onGeneratorChanged(QString const& name);

protected:
  QComboBox* GeneratorOptions;
  QRadioButton* CompilerSetupOptions[4];
  QFrame* ToolsetFrame;
  QLineEdit* Toolset;
  QLabel* ToolsetLabel;
  QFrame* PlatformFrame;
  QComboBox* PlatformOptions;
  QLabel* PlatformLabel;
  QStringList GeneratorsSupportingToolset;
  QStringList GeneratorsSupportingPlatform;
  QMultiMap<QString, QString> GeneratorSupportedPlatforms;
  QMap<QString, QString> GeneratorDefaultPlatform;
  QString DefaultGeneratorPlatform, DefaultGeneratorToolset;

private:
  QFrame* CreateToolsetWidgets();
  QFrame* CreatePlatformWidgets();
};

//! the page that gives basic options for native compilers
class NativeCompilerSetup
  : public QWizardPage
  , protected Ui::Compilers
{
  Q_OBJECT
public:
  NativeCompilerSetup(QWidget* p);
  ~NativeCompilerSetup();

  QString getCCompiler() const;
  void setCCompiler(const QString&);

  QString getCXXCompiler() const;
  void setCXXCompiler(const QString&);

  QString getFortranCompiler() const;
  void setFortranCompiler(const QString&);

  int nextId() const { return -1; }
};

//! the page that gives options for cross compilers
class CrossCompilerSetup
  : public QWizardPage
  , protected Ui::CrossCompiler
{
  Q_OBJECT
public:
  CrossCompilerSetup(QWidget* p);
  ~CrossCompilerSetup();

  QString getSystem() const;
  void setSystem(const QString&);

  QString getVersion() const;
  void setVersion(const QString&);

  QString getProcessor() const;
  void setProcessor(const QString&);

  QString getCCompiler() const;
  void setCCompiler(const QString&);

  QString getCXXCompiler() const;
  void setCXXCompiler(const QString&);

  QString getFortranCompiler() const;
  void setFortranCompiler(const QString&);

  QString getFindRoot() const;
  void setFindRoot(const QString&);

  enum CrossMode
  {
    BOTH,
    ONLY,
    NEVER
  };

  int getProgramMode() const;
  void setProgramMode(int);
  int getLibraryMode() const;
  void setLibraryMode(int);
  int getIncludeMode() const;
  void setIncludeMode(int);

  int nextId() const { return -1; }
};

//! the page that gives options for a toolchain file
class ToolchainCompilerSetup : public QWizardPage
{
  Q_OBJECT
public:
  ToolchainCompilerSetup(QWidget* p);
  ~ToolchainCompilerSetup();

  QString toolchainFile() const;
  void setToolchainFile(const QString&);

  int nextId() const { return -1; }

protected:
  QCMakeFilePathEditor* ToolchainFile;
};

//! the wizard with the pages
class FirstConfigure : public QWizard
{
  Q_OBJECT
public:
  FirstConfigure();
  ~FirstConfigure();

  void setGenerators(std::vector<cmake::GeneratorInfo> const& gens);
  QString getGenerator() const;
  QString getPlatform() const;
  QString getToolset() const;

  bool defaultSetup() const;
  bool compilerSetup() const;
  bool crossCompilerSetup() const;
  bool crossCompilerToolChainFile() const;

  QString getCCompiler() const;
  QString getCXXCompiler() const;
  QString getFortranCompiler() const;

  QString getSystemName() const;
  QString getSystemVersion() const;
  QString getSystemProcessor() const;
  QString getCrossRoot() const;
  QString getCrossProgramMode() const;
  QString getCrossLibraryMode() const;
  QString getCrossIncludeMode() const;

  QString getCrossCompilerToolChainFile() const;

  void loadFromSettings();
  void saveToSettings();

protected:
  StartCompilerSetup* mStartCompilerSetupPage;
  NativeCompilerSetup* mNativeCompilerSetupPage;
  CrossCompilerSetup* mCrossCompilerSetupPage;
  ToolchainCompilerSetup* mToolchainCompilerSetupPage;
  QString mDefaultGenerator;
};

#endif // FirstConfigure_h
