/*
 * Copyright 2000-2011 JetBrains s.r.o.
 *
 * 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 com.intellij.openapi.updateSettings.impl;


import com.intellij.ide.IdeBundle;
import com.intellij.ide.reporter.ConnectionException;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.net.HttpConfigurable;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class UpdatesXmlLoader {

  private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.updateSettings.impl.UpdatesXmlLoader");

  private final String updateUrl;

  public UpdatesXmlLoader(final String updatesUrl) {
    this.updateUrl = updatesUrl;
  }


  @Nullable
  public UpdatesInfo loadUpdatesInfo() throws ConnectionException{
    LOG.debug("load update xml (UPDATE_URL='" + updateUrl + "' )");

    if (StringUtil.isEmpty(updateUrl)) {
      LOG.debug("update url is empty: updates will not be checked");
      return null;
    }

    final Ref<Exception> error = new Ref<Exception>();
    FutureTask<UpdatesInfo> ft = new FutureTask<UpdatesInfo>(new Callable<UpdatesInfo>() {
      @Nullable
      @Override
      public UpdatesInfo call() throws Exception {
        try {
          prepareUrl(updateUrl);

          URL requestUrl = prepareRequestUrl(updateUrl);

          URLConnection connection = requestUrl.openConnection();
          connection.setConnectTimeout(HttpConfigurable.CONNECTION_TIMEOUT);
          connection.setReadTimeout(HttpConfigurable.CONNECTION_TIMEOUT);
          final InputStream inputStream = connection.getInputStream();
          Reader reader = new InputStreamReader(inputStream);
          try {
            return new UpdatesInfo(JDOMUtil.loadDocument(inputStream).getRootElement());
          }
          catch (JDOMException e) {
            LOG.info(e); // Broken xml downloaded. Don't bother telling user.
          }
          finally {
            reader.close();
            inputStream.close();
          }
        }
        catch (Exception e) {
          error.set(e);
        }
        return null;
      }
    });
    ApplicationManager.getApplication().executeOnPooledThread(ft);
    try {
      UpdatesInfo result = ft.get(5, TimeUnit.SECONDS);
      if (!error.isNull()) {
        //noinspection ThrowableResultOfMethodCallIgnored
        throw new ConnectionException(error.get());
      }
      return result;
    }
    catch (TimeoutException e) {
      // ignore
    }
    catch (Exception e) {
      LOG.debug(e);
      throw new ConnectionException(e.getMessage(),e);
    }
    if (!ft.isDone()) {
      ft.cancel(true);
      throw new ConnectionException(IdeBundle.message("updates.timeout.error"));
    }
    return null;

  }


  protected static void prepareUrl(@NotNull String url) throws ConnectionException {
    try {
      HttpConfigurable.getInstance().prepareURL(url);
    }
    catch (Exception e) {
      throw new ConnectionException(e);
    }
  }

  protected URL prepareRequestUrl(@NotNull String url) throws ConnectionException {
    try {
      if (url.startsWith("file:")) {
        return new URL(url);
      }
      return new URL(url + "?" + UpdateChecker.prepareUpdateCheckArgs());
    }
    catch (Exception e) {
      throw new ConnectionException(e);
    }
  }
}
