#ifndef TASKSAMMFIM_H
#define TASKSAMMFIM_H

#include <QString>
#include <QList>
#include "DataBaseLMS_global.h"

struct ModeList
{
    bool demo = false;
    bool train = false;
    bool exam = false;
    bool autoM = false;
};

class DATABASELMS_EXPORT SubProc
{
public:
    SubProc()
    {
        modeListStr = buildCanplay(modeList);
    };
    ~SubProc(){};
public:
    bool operator==(const SubProc& other) const
    {
        // Сравнение членов класса
        return (this->dmCode == other.dmCode && this->title == other.title && this->modeListStr == other.modeListStr);
    }

public:
    void setModeList(const ModeList &modeList);
    ModeList getModeList() const;

    void setModeListStr(const QString &modeListStr);
    QString getModeListStr() const;

    void setDmCode(const QString &value);
    QString getDmCode() const;

    void setTitle(const QString &value);
    QString getTitle() const;

public:
    static QString buildCanplay(ModeList modeList);
    static ModeList parseCanplay(QString canplay);

private:
    QString dmCode = "";
    QString title = "";

    ModeList modeList;
    QString modeListStr = "";
};

class DATABASELMS_EXPORT ProcedureID
{
public:
    ProcedureID(){};
    ~ProcedureID(){};
public:
    QString doc;          // "amm", "fim"
    QString dmCode;
    QString title;
    QString result;       // "" - нет результата, "viewed" - процедура изучена (просмотрена при отсутствующем сценарии), "completed" - выполнена (в т.ч. режим "контроль" сценария)
};

class DATABASELMS_EXPORT MalfunctionSign            // признак неисправности
{
public:
    MalfunctionSign(){};
    ~MalfunctionSign(){};
public:
    void initialize(int type, QString description);
public:
    int type;     // "1" - аварийно-сигнальные сообщения, "2" - сообщения БСТО,
                      // "3" - сигнализация СЭИ, "4" - локальная сигнализация, "5" - наблюдаемая неисправность
    QString description;  // описание (напр. "ЭРРД, 25, DOOR_FAIL_TO_CLOSE" - для БСТО)
};

class DATABASELMS_EXPORT Malfunction        // неисправность
{
public:
    Malfunction(){};
    ~Malfunction(){};
public:
    void initialize(QString dmCode, QString num, QString description);
    void addMalfunctionSign(MalfunctionSign sign);
public:
    QString dmCode;    // dmCode процедуры
    QString num;          // номер по-порядку в пункте "2. Возможные причины" процедуры
    QString description;  // описание
    QList<MalfunctionSign> malfunctionSigns;// список соответствующих неисправности признаков
};

class DATABASELMS_EXPORT FIMReportItem
{
public:
    FIMReportItem(){};
    ~FIMReportItem(){};
public:
    int id = 0; // для идентификации в БД
    QString text;             // текст, вводимый обучаемым
    ProcedureID procedure;   // ссылка на процедуру, при необходимости
};

class DATABASELMS_EXPORT FIMReport
{
public:
    FIMReport(){};
    ~FIMReport(){};
public:
    int id = 0; // для идентификации в БД
    QList<FIMReportItem> itemList;
};

class DATABASELMS_EXPORT TaskAmmFim
{
public:
    TaskAmmFim(){};
    ~TaskAmmFim(){};
public:
    void initialize(int id, QString type, QString title, QString status, QString created_date, QString changed_date);
    void addMalfunction(Malfunction malfunction);

public:
    void setID(int id){this->id = id;};
    int getID(){return id;};
public:

    int id; // для идентификации в БД

    QString type;    // "amm" - процедура из Руководства по технической эксплуатации
                             // "fim" - поиск и устранение неисправностей

    QString title;    // название задания:
                            // для "amm" - берётся из титула процедуры
                            // для "fim" - вводится вручную

    QString status; // "new" - задание не выполнено
                             // "checkup" - выполнено, на проверке у инструктора (только для "fim")
                             // "failed" - инструктором проверено, выполнено неверно (только для "fim")
                             // "completed" - выполнено корректно

    QString created_date;   // дата создания задания инструктором ("new")
                                           // (при записи в базу, даты ставить по времени сервера, а не те, что присланы от клиента)
    QString changed_date;  // дата крайнего изменения статуса ("checkup", "failed", "completed")

    // amm:
    ProcedureID ammProcedure;   // ссылка на процедуру в AMM

    // fim:
    QList<Malfunction> malfunctionList; // список неисправностей
    FIMReport report;   // отчет по выполнению "fim"

    QList<SubProc> listSubProc;

    static int lastID;
};

#endif // TASKSAMMFIM_H
