//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      GUI/Models/JobItem.h
//! @brief     Defines class JobItem
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#ifndef BORNAGAIN_GUI_MODELS_JOBITEM_H
#define BORNAGAIN_GUI_MODELS_JOBITEM_H

#include "GUI/Models/SessionItem.h"

class DataItem;
class Data1DViewItem;
class FitParameterContainerItem;
class FitSuiteItem;
class InstrumentItem;
class IntensityDataItem;
class MaterialItemContainer;
class MultiLayerItem;
class ParameterContainerItem;
class RealDataItem;
class ISimulation;
class SimulationOptionsItem;

class BA_CORE_API_ JobItem : public SessionItem {

private:
    static const QString P_IDENTIFIER;
    static const QString P_SAMPLE_NAME;
    static const QString P_INSTRUMENT_NAME;
    static const QString P_WITH_FITTING;
    static const QString P_STATUS;
    static const QString P_BEGIN_TIME;
    static const QString P_END_TIME;
    static const QString P_DURATION;
    static const QString P_COMMENTS;
    static const QString P_PROGRESS;
    static const QString P_PRESENTATION_TYPE;
    static const QString T_SAMPLE;

public:
    static const QString T_MATERIAL_CONTAINER;
    static const QString T_INSTRUMENT;
    static const QString T_OUTPUT;
    static const QString T_REALDATA;
    static const QString T_DATAVIEW;
    static const QString T_PARAMETER_TREE;
    static const QString T_SIMULATION_OPTIONS;
    static const QString T_FIT_SUITE;

    JobItem();

    QString getIdentifier() const;
    void setIdentifier(const QString& identifier);

    IntensityDataItem* intensityDataItem();
    DataItem* dataItem();

    QString getStatus() const;
    void setStatus(const QString& status);
    static bool isStatusPropertyName(const QString& name);

    bool isIdle() const;
    bool isRunning() const;
    bool isCompleted() const;
    bool isCanceled() const;
    bool isFailed() const;
    bool isValidForFitting();

    void setBeginTime(const QString& begin_time);

    void setEndTime(const QString& end_time);

    void setDuration(int duration);

    QString getComments() const;
    void setComments(const QString& comments);
    static bool isCommentsPropertyName(const QString& name);

    int getProgress() const;
    void setProgress(int progress);

    bool runImmediately() const;
    bool runInBackground() const;

    MultiLayerItem* sampleItem();
    MultiLayerItem* copySampleIntoJob(const MultiLayerItem* sample);

    InstrumentItem* instrumentItem();

    SimulationOptionsItem* simulationOptionsItem();

    void setResults(const ISimulation* simulation);

    FitSuiteItem* fitSuiteItem();
    ParameterContainerItem* parameterContainerItem();
    const ParameterContainerItem* parameterContainerItem() const;

    FitParameterContainerItem* fitParameterContainerItem();
    RealDataItem* realDataItem();

    const MaterialItemContainer* materialContainerItem() const;

    Data1DViewItem* dataItemView();

    void setSampleName(const QString& name);

    void setInstrumentName(const QString& name);    

    const QString presentationType() const;
    void setPresentationType(const QString& type);

private:
    void updateIntensityDataFileName();
    const SimulationOptionsItem* simulationOptionsItem() const;
};

#endif // BORNAGAIN_GUI_MODELS_JOBITEM_H