/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.google.idea.blaze.android.plugin;

import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.io.CharStreams;
import com.intellij.notification.NotificationDisplayType;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.util.BuildNumber;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.annotation.Nullable;
import org.jetbrains.annotations.NotNull;

/**
 * Checks META-INF/product-build.txt for a product build number and compares them against the build.
 * If incompatible, it informs the user.
 */
public class PluginCompatibilityEnforcer implements ApplicationComponent {
  private static final Logger LOG = Logger.getInstance(PluginCompatibilityEnforcer.class);
  private static final NotificationGroup NOTIFICATION_GROUP =
      new NotificationGroup("ASwB Plugin Version", NotificationDisplayType.BALLOON, true);

  public void checkPluginCompatibility() {
    String pluginProductBuildString = readProductBuildTxt();
    if (Strings.isNullOrEmpty(pluginProductBuildString)) {
      return;
    }
    // Dev mode?
    if (pluginProductBuildString.equals("PRODUCT_BUILD")) {
      return;
    }
    BuildNumber pluginProductBuild = BuildNumber.fromString(pluginProductBuildString);
    if (pluginProductBuild == null) {
      LOG.warn("Invalid META-INF/product-build.txt");
      return;
    }

    if (!isCompatible(pluginProductBuild)) {
      String message =
          Joiner.on(' ')
              .join(
                  "Invalid Android Studio version for the ASwB plugin.",
                  "Android Studio version: " + ApplicationInfo.getInstance().getBuild(),
                  "Compatible version: " + pluginProductBuild,
                  "Please update the ASwB plugin from the plugin manager.");
      NOTIFICATION_GROUP.createNotification(message, MessageType.ERROR).notify(null);
      LOG.warn(message);
    }
  }

  private boolean isCompatible(BuildNumber pluginProductBuild) {
    if (pluginProductBuild.isSnapshot()) {
      return true;
    }
    BuildNumber buildNumber = ApplicationInfo.getInstance().getBuild();
    if (buildNumber == null || buildNumber.isSnapshot()) {
      return true;
    }
    return buildNumber.equals(pluginProductBuild);
  }

  @Nullable
  private String readProductBuildTxt() {
    try (InputStream inputStream =
        getClass().getClassLoader().getResourceAsStream("META-INF/product-build.txt")) {
      if (inputStream == null) {
        return null;
      }
      return CharStreams.toString(new InputStreamReader(inputStream)).trim();
    } catch (IOException e) {
      LOG.error("Could not read META-INF/product-build.txt", e);
      return null;
    }
  }

  @Override
  public void initComponent() {
    checkPluginCompatibility();
  }

  @Override
  public void disposeComponent() {}

  @NotNull
  @Override
  public String getComponentName() {
    return "ASwB plugin compatibility enforcer";
  }
}
