#include "DatabaseManager.h"
#include <QCoreApplication>
#include <QSqlError>
#include <QDebug>
#include <QThread>

DatabaseManager::DatabaseManager() = default;

DatabaseManager::~DatabaseManager() {
    QMutexLocker locker(&mutex);

    for (auto it = connectionPool.begin(); it != connectionPool.end(); ++it) {
        QSqlDatabase::removeDatabase(it.key());
    }
    qDebug() << "Все соединения закрыты";
}

DatabaseManager &DatabaseManager::instance() {
    static DatabaseManager instance;
    return instance;
}

QSqlDatabase DatabaseManager::database() {
    QMutexLocker locker(&mutex);
    QString name = connectionName();

    // Создаем новое соединение, если его ещё нет
    if (!connectionPool.contains(name)) {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", name);
        db.setDatabaseName(QCoreApplication::applicationDirPath() + "/database/app_data.db");

        if (!db.open()) {
            qWarning() << "Ошибка открытия базы данных:" << db.lastError().text();
        }

        connectionPool[name] = db;

        // Автоматическое удаление соединения при завершении потока
        QObject::connect(QThread::currentThread(), &QThread::finished, [this, name]() {
            QMutexLocker cLocker(&mutex);
            if (connectionPool.contains(name)) {
                connectionPool.remove(name);
                QSqlDatabase::removeDatabase(name);
                qDebug() << "Соединение" << name << "удалено";
            }
        });
    }

    return connectionPool[name];
}

QString DatabaseManager::connectionName() {
    return QString("connection_%1").arg(reinterpret_cast<quintptr>(QThread::currentThreadId()));
}


void DatabaseManager::closeConnection() {
    QMutexLocker locker(&mutex);
    if (const QString name = connectionName(); connectionPool.contains(name)) {
        connectionPool.remove(name);
        QSqlDatabase::removeDatabase(name);
        qDebug() << "Соединение" << name << "удалено вручную";
    }
}
