#include <QApplication>
#include <QLabel>
#include <QCoreApplication>
#include <QDebug>
#include <QDateTime>
#include <QFile>
#include <QTextStream>

#include "dock.h"

void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
    // static QFile logFile("debug_output.log");
    // if (!logFile.isOpen()) {
    //     logFile.open(QIODevice::Append | QIODevice::Text);
    // }

    // QTextStream out(&logFile);
    QTextStream console(stdout);

    QString levelStr;
    QString colorStart;
    const QString colorEnd = "\033[0m";

    switch (type) {
    case QtDebugMsg:
        levelStr = "DEBUG";
        colorStart = "\033[36m"; // Cyan
        break;
    case QtInfoMsg:
        levelStr = "INFO";
        colorStart = "\033[32m"; // Green
        break;
    case QtWarningMsg:
        levelStr = "WARNING";
        colorStart = "\033[33m"; // Yellow
        break;
    case QtCriticalMsg:
        levelStr = "CRITICAL";
        colorStart = "\033[31m"; // Red
        break;
    case QtFatalMsg:
        levelStr = "FATAL";
        colorStart = "\033[41m\033[97m"; // Red background, white text
        break;
    }

    QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");

    // Plain version for log file
    QString plainText = QString("[%1] [%2] %3 (%4:%5)")
        .arg(time, levelStr, msg, context.file, QString::number(context.line));

    // Colored level only for console
    QString coloredText = QString("[%1] [%2%3%4] %5 (%6:%7)")
        .arg(time, colorStart, levelStr, colorEnd, msg, context.file, QString::number(context.line));

    // out << plainText << "\n";
    // out.flush();

    console << coloredText << "\n";
    console.flush();

    if (type == QtFatalMsg)
        abort();
}

int main(int argc, char *argv[]) {
    qInstallMessageHandler(customMessageHandler);

    QApplication app(argc, argv);
    Dock dock{&app};

    return 0;
}