#include "theme.h"
#include "common/parsing.h"
#include "detection/gtk_qt/gtk_qt.h"
#include "detection/displayserver/displayserver.h"

const char* ffDetectTheme(FFThemeResult* result) {
    const FFDisplayServerResult* wmde = ffConnectDisplayServer();

    if (ffStrbufIgnCaseEqualS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY)) {
        return "Theme isn't supported in TTY";
    }

    const FFQtResult* plasma = ffDetectQt();
    const FFstrbuf* gtk2 = &ffDetectGTK2()->theme;
    const FFstrbuf* gtk3 = &ffDetectGTK3()->theme;
    const FFstrbuf* gtk4 = &ffDetectGTK4()->theme;

    if (plasma->widgetStyle.length == 0 && plasma->colorScheme.length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0) {
        return "No themes found";
    }

    ffParseGTK(&result->theme2, gtk2, gtk3, gtk4);

    FF_STRBUF_AUTO_DESTROY plasmaColorPretty = ffStrbufCreate();
    if (ffStrbufStartsWithIgnCase(&plasma->colorScheme, &plasma->widgetStyle)) {
        ffStrbufAppendNS(&plasmaColorPretty, plasma->colorScheme.length - plasma->widgetStyle.length, &plasma->colorScheme.chars[plasma->widgetStyle.length]);
    } else {
        ffStrbufAppend(&plasmaColorPretty, &plasma->colorScheme);
    }

    ffStrbufTrim(&plasmaColorPretty, ' ');

    if (plasma->widgetStyle.length > 0) {
        ffStrbufAppend(&result->theme1, &plasma->widgetStyle);

        if (plasma->colorScheme.length > 0) {
            ffStrbufAppendS(&result->theme1, " (");

            if (plasmaColorPretty.length > 0) {
                ffStrbufAppend(&result->theme1, &plasmaColorPretty);
            } else {
                ffStrbufAppend(&result->theme1, &plasma->colorScheme);
            }

            ffStrbufAppendC(&result->theme1, ')');
        }
    } else if (plasma->colorScheme.length > 0) {
        if (plasmaColorPretty.length > 0) {
            ffStrbufAppend(&result->theme1, &plasmaColorPretty);
        } else {
            ffStrbufAppend(&result->theme1, &plasma->colorScheme);
        }
    }

    if (plasma->widgetStyle.length > 0 || plasma->colorScheme.length > 0) {
        ffStrbufAppendS(&result->theme1, " [Qt]");
    }

    return nullptr;
}
