
#ifndef FirstConfigure_h
#define FirstConfigure_h

#include <QWizard>
#include <QWizardPage>
#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(QWidget* p);
    ~StartCompilerSetup();
    void setGenerators(const QStringList& gens);
    void setCurrentGenerator(const QString& gen);
    QString getGenerator() const;

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

    int nextId() const;

  signals:
    void selectionChanged();

  protected slots:
    void onSelectionChanged(bool);

  protected:
    QComboBox* GeneratorOptions;
    QRadioButton* CompilerSetupOptions[4];
};

//! 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(const QStringList& gens);
  QString getGenerator() 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;

};

#endif // FirstConfigure_h

