#ifndef DATABASELMS_H
#define DATABASELMS_H

#include <QSqlDatabase>
#include <QMutex>

#include "instructor.h"
#include "trainee.h"
#include "group.h"

class DataBaseLMS
{
public:
    DataBaseLMS();
    ~DataBaseLMS();

protected:
    //Подключение
    bool createConnection();
    void deleteConnection();
    bool isConnected();

    //Транзакции
    bool transactionBegin();
    bool transactionEnd();

    //Списки
    QList<Instructor> selectAllInstructors();
    QList<Trainee> selectAllTrainees();
    QList<Group> selectAllGroups();

    //Инструктор
    Instructor selectInstructor(int id_instructor);
    int selectInstructorID(QString login, QString password = QStringLiteral(""));
    QString selectInstructorNameByLogin(QString login);
    bool selectInstructorIsAdmin(int id_instructor);
    bool selectInstructorLoggedIn(int id_instructor);
    bool selectInstructorArchived(int id_instructor);
    int updateInstructorLoggedIn(int id_instructor, bool loggedIn);
    bool updateAllInstructorsLoggedIn(bool loggedIn);
    int updateInstructorArchived(int id_instructor, bool archived);

    int insertInstructor();
    int insertInstructor(Instructor instructor);
    int deleteInstructor(int id_instructor);
    int updateInstructor(Instructor instructor);

    //Группа
    Group selectGroup(int id_group);
    int insertGroup();
    int insertGroup(Group group);
    int deleteGroup(int group_id);
    int updateGroup(Group group);

    //Обучаемый
    Trainee selectTrainee(int id_trainee);
    QList<Trainee> selectAllTraineesInGroup(int id_group);
    int selectTraineeID(QString login, QString password = QStringLiteral(""));
    QString selectTraineeNameByLogin(QString login);
    QString selectTraineeNameOnComputer(QString computer_name);
    Trainee selectTraineeOnComputer(QString computer_name);
    bool selectTraineeArchived(int id_trainee);
    bool selectTraineeLoggedIn(int id_trainee);
    int updateTraineeLoggedIn(int id_trainee, bool loggedIn);
    bool updateAllTraineesLoggedIn(bool loggedIn);
    int updateTraineeArchived(int id_trainee, bool archived);

    int insertTrainee(int id_group);
    int insertTrainee(Trainee trainee);
    int deleteTrainee(int trainee_id);
    int updateTrainee(Trainee trainee);

    QList<Task> selectTasksOfTrainee(int trainee_id);

private:
    int queryExecInt(QString queryStr);
    QString queryExecString(QString queryStr);
    bool queryExecBool(QString queryStr);
    bool queryExec(QString queryStr, QSqlQuery* query);
    void messageWarningErrorQuery(QString queryStr, QSqlQuery* query);

protected:
    QSqlDatabase* db;
    const QString dbName = "DataBaseLMS";
private:
    bool transactionBegined;    
    const QString dbUserName = "postgres";
    const QString dbPassword = "12345678";
    const QString dbType = "QPSQL";

    QMutex mtxAccess;
};

#endif // DATABASELMS_H
