/*
 * Copyright 2005 Sascha Weinreuter
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.intellij.lang.xpath.xslt.impl.references;

import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

class SelfReference implements PsiReference {
  private final XmlAttributeValue myValue;
  private final PsiElement myTarget;
  private final int myStartOffset;

  public SelfReference(XmlAttribute element, PsiElement target, int startOffset) {
    myTarget = target;
    myValue = element.getValueElement();
    myStartOffset = startOffset;
  }

  SelfReference(XmlAttribute element, PsiElement target) {
    this(element, target, 0);
  }

  public PsiElement getElement() {
    return myValue;
  }

  public TextRange getRangeInElement() {
    return TextRange.from(1 + myStartOffset, myValue.getTextLength() - (2 + myStartOffset));
  }

  @Nullable
  public PsiElement resolve() {
    return myValue.isValid() ? myTarget : null;
  }

  @NotNull
  public String getCanonicalText() {
    return myValue.getText();
  }

  public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
    return myValue;
  }

  public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
    return myValue;
  }

  public boolean isReferenceTo(PsiElement element) {
    return false;
  }

  @NotNull
  public Object[] getVariants() {
    return ArrayUtil.EMPTY_OBJECT_ARRAY;
  }

  public boolean isSoft() {
    return false;
  }

  public static SelfReference create(XmlAttribute element, PsiElement target) {
    if (element.getValue().contains(":")) {
      return new SelfReference(element, target, element.getValue().indexOf(':') + 1);
    }
    return new SelfReference(element, target);
  }
}
