
#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

