/*
 * 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.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.LocalQuickFixProvider;
import com.intellij.javaee.ExternalResourceManager;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
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.IncorrectOperationException;
import org.intellij.lang.xpath.xslt.quickfix.DownloadResourceFix;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

class ExternalResourceReference implements PsiReference, LocalQuickFixProvider {
  private final XmlAttribute myAttribute;
  private final ExternalResourceManager myResourceManager = ExternalResourceManager.getInstance();

  public ExternalResourceReference(XmlAttribute attribute) {
    myAttribute = attribute;
  }

  @Nullable
  @Override
  public LocalQuickFix[] getQuickFixes() {
    return new LocalQuickFix[] { new DownloadResourceFix(myAttribute.getValue()) };
  }


  @Nullable
  public PsiElement getElement() {
    return myAttribute.getValueElement();
  }

  public TextRange getRangeInElement() {
    final XmlAttributeValue value = myAttribute.getValueElement();
    return value != null ? TextRange.from(1, value.getTextLength() - 2) : TextRange.from(0, 0);
  }

  @Nullable
  public PsiElement resolve() {
    final String value = myAttribute.getValue();
    final String resourceLocation = myResourceManager.getResourceLocation(value);

    //noinspection StringEquality
    if (resourceLocation != value) {
      VirtualFile file;
      try {
        file = VfsUtil.findFileByURL(new URL(resourceLocation));
      }
      catch (MalformedURLException e) {
        try {
          file = VfsUtil.findFileByURL(new File(resourceLocation).toURI().toURL());
        }
        catch (MalformedURLException e1) {
          file = null;
        }
      }
      if (file != null) {
        return myAttribute.getManager().findFile(file);
      }
    }
    return null;
  }

  @NotNull
  public String getCanonicalText() {
    return myAttribute.getValue();
  }

  public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
    myAttribute.setValue(newElementName);
    final XmlAttributeValue value = myAttribute.getValueElement();
    assert value != null;
    return value;
  }

  public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
    throw new UnsupportedOperationException();
  }

  public boolean isReferenceTo(PsiElement element) {
    return element == resolve();
  }

  @NotNull
  public Object[] getVariants() {
    return myResourceManager.getResourceUrls(null, false);
  }

  public boolean isSoft() {
    return false;
  }
}
