package com.intellij.plugins.thrift.completion;

import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.plugins.thrift.ThriftLanguage;
import com.intellij.plugins.thrift.lang.psi.ThriftGenericType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;

/**
 * Created by fkorotkov.
 */
public class ThriftTypeHandler extends TypedHandlerDelegate {
  @Override
  public Result beforeCharTyped(char c, Project project, Editor editor, PsiFile file, FileType fileType) {
    if (!isThriftContext(file)) {
      return super.charTyped(c, project, editor, file);
    }
    if (c == '>') {
      int offset = editor.getCaretModel().getOffset();
      final char charAtOffset = editor.getDocument().getCharsSequence().charAt(offset);
      final PsiElement elementAtOffset = file.findElementAt(offset);
      if (charAtOffset == '>' && elementAtOffset != null && elementAtOffset.getParent() instanceof ThriftGenericType) {
        editor.getCaretModel().moveToOffset(offset + 1);
        return Result.STOP;
      }
    }
    return super.beforeCharTyped(c, project, editor, file, fileType);
  }

  @Override
  public Result charTyped(char c, Project project, @NotNull Editor editor, @NotNull PsiFile file) {
    if (!isThriftContext(file)) {
      return super.charTyped(c, project, editor, file);
    }
    if (c == '<') {
      int offset = editor.getCaretModel().getOffset();
      editor.getDocument().insertString(offset, ">");
      editor.getCaretModel().moveToOffset(offset);
      return Result.STOP;
    }
    return super.charTyped(c, project, editor, file);
  }

  private static boolean isThriftContext(PsiFile file) {
    return file.getLanguage() instanceof ThriftLanguage;
  }
}