package io.edgeg.gtm.intellij;

import com.intellij.ide.ui.UISettings;
import com.intellij.ide.ui.UISettingsListener;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.FileEditorManagerEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.StatusBarWidget;
import com.intellij.openapi.wm.impl.status.EditorBasedWidget;
import com.intellij.util.Consumer;
import com.intellij.util.ui.UIUtil;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;

public class GTMStatusWidget extends EditorBasedWidget implements StatusBarWidget.Multiframe, StatusBarWidget.TextPresentation {
    private static final String id = GTMStatusWidget.class.getName();
    private final AtomicBoolean opened = new AtomicBoolean();
    private String myText = "";

    private GTMStatusWidget(@NotNull Project project) {
        super(project);
    }

    private void runUpdateLater() {
        UIUtil.invokeLaterIfNeeded(() -> {
            if (opened.get()) {
                runUpdate();
            }
        });
    }

    static GTMStatusWidget create(@NotNull Project project) {
        return new GTMStatusWidget(project);
    }

    @Override
    public StatusBarWidget copy() {
        return new GTMStatusWidget(myProject);
    }

    @NotNull
    @Override
    public String ID() {
        return id;
    }

    @Nullable
    @Override
    public WidgetPresentation getPresentation(@NotNull PlatformType platformType) {
        return this;
    }

    @NotNull
    @Override
    public String getText() {
        return myText;
    }

    @NotNull
    @Override
    public String getMaxPossibleText() {
        return "";
    }

    void setText(String txt) {
        if (txt == null) { return; }
        if (Objects.equals(txt,"")) { myText = "GTM"; return; }
        myText = txt.replaceAll("\\s*\\d*s\\s*$", "");
        myText = "GTM: " + StringUtils.join(myText.split("\\s+"), " ");
    }

    @Override
    public float getAlignment() {
        return Component.LEFT_ALIGNMENT;
    }

    @Nullable
    @Override
    public String getTooltipText() {
        if (!GTMRecord.gtmExeFound) { return GTMConfig.getInstance().gtmNotFound; }
        if (!GTMRecord.gtmVersionOK) { return GTMConfig.getInstance().gtmVerOutdated; }
        return "<B>Git Time Metric (GTM)</B>";
    }

    @Override
    public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
        runUpdate();
    }

    @Override
    public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
        runUpdate();
    }

    @Override
    public void selectionChanged(@NotNull FileEditorManagerEvent event) {
        runUpdate();
    }

    void updateStatusBar() {
        if (myStatusBar != null) {
            myStatusBar.updateWidget(ID());
        }
    }

    private void runUpdate() {
        updateStatusBar();
    }

    @Nullable
    @Override
    public Consumer<MouseEvent> getClickConsumer() {
        return mouseEvent -> runUpdate();
    }

    @Override
    public void install(@NotNull StatusBar statusBar) {
        super.install(statusBar);
        myConnection.subscribe(UISettingsListener.TOPIC, uiSettings -> runUpdateLater());
    }

    void installed() {
        opened.compareAndSet(false, true);
    }

    void uninstalled() {
        opened.compareAndSet(true, false);
    }
}