package org.atoum.intellij.plugin.atoum.actions;

import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.Project;
import com.jetbrains.php.lang.psi.PhpFile;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import org.jetbrains.annotations.Nullable;
import com.intellij.ide.actions.OpenFileAction;
import org.atoum.intellij.plugin.atoum.Utils;

public class SwitchContext extends AnAction {

    @Override
    public void update(AnActionEvent e) {
        e.getPresentation().setEnabled(false);
        e.getPresentation().setVisible(true);
        e.getPresentation().setText("atoum - switch to");

        PhpClass testedClass = getSwitchClass(e);
        if (null == testedClass) {
            return;
        }

        e.getPresentation().setText("atoum - switch to : " + testedClass.getFQN(), false);
        e.getPresentation().setEnabled(true);
    }

    public void actionPerformed(final AnActionEvent e) {
        PhpClass testedClass = getSwitchClass(e);
        if (null == testedClass) {
            return;
        }

        OpenFileAction.openFile(testedClass.getContainingFile().getVirtualFile().getPath(), e.getProject());
    }

    @Nullable
    protected PhpClass getSwitchClass(final AnActionEvent e) {
        Object psiFile = e.getData(PlatformDataKeys.PSI_FILE);

        if (null == psiFile) {
            return null;
        }

        if (!(psiFile instanceof PhpFile)) {
            return null;
        }
        PhpFile phpFile = ((PhpFile) psiFile);
        PhpClass testedClass = getSwitchClass(e.getProject(), phpFile);

        if (null == testedClass) {
            return null;
        }

        return testedClass;
    }

    @Nullable
    protected PhpClass getSwitchClass(Project project, PhpFile phpFile) {
        PhpClass currentClass = Utils.getFirstTestClassFromFile(phpFile);
        if (currentClass != null) {
            // The file contains a test class, switch to the tested class
            return Utils.locateTestedClass(project, currentClass);
        }

        currentClass = Utils.getFirstClassFromFile(phpFile);
        if (currentClass != null) {
            // The file contains a class, switch to the test class if it exists
            return Utils.locateTestClass(project, currentClass);
        }

        return null;
    }
}