package com.eslint.fixes;

import com.eslint.ESLintBundle;
import com.intellij.lang.javascript.psi.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
 * @author idok
 */
public class StrictActionFix extends BaseActionFix {
    public StrictActionFix(PsiElement element) {
        super(element);
    }

    @NotNull
    @Override
    public String getText() {
        return ESLintBundle.message("inspection.fix.strict");
    }

    @Override
    public void invoke(@NotNull Project project, @NotNull PsiFile psiFile, @Nullable("is null when called from inspection") Editor editor, @NotNull PsiElement element, @NotNull PsiElement end) throws IncorrectOperationException {
        final PsiElement parent = element.getParent();
        if (!(parent instanceof JSFunctionExpression || parent instanceof JSFunction)) return;

//            if (parent.getChildren().length < 2) {
//                return;
//            }

        JSBlockStatement block = null;
        for (PsiElement elem : parent.getChildren()) {
            if (elem instanceof JSBlockStatement) {
                block = (JSBlockStatement) elem;
                break;
            }
        }

        if (block != null) {
            TextRange textRange = block.getTextRange();

//                PsiTreeUtil. JSPsiImplUtils
            final JSExpressionCodeFragment useStrict = JSElementFactory.createExpressionCodeFragment(project, "'use strict';\n", block);
            PsiElement child = useStrict.getFirstChild();
            if (block.getStatements().length == 0) {
                block.add(child);
            } else {
                block.addBefore(child, block.getStatements()[0]);
            }
//                final JSBlockStatement finalBlock = block;
//                ApplicationManager.getApplication().runWriteAction(new Runnable() {
//                    @Override
//                    public void run() {
//                        finalBlock.add(useStrict);
//                    }
//                });

//                if (textRange != null) {
//                    Document document = PsiDocumentManager.getInstance(project).getDocument(element.getContainingFile());
////                    TextRange docRange = textRange.shiftRight(element.getTextRange().getStartOffset());
//                    document.insertString(textRange.getStartOffset() + 1, "\n'use strict';");
//                }
        }
    }
}
