/*
 * 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.base.actions;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.Lists;
import com.google.idea.blaze.base.async.executor.BlazeExecutor;
import com.google.idea.blaze.base.experiments.ExperimentScope;
import com.google.idea.blaze.base.filecache.FileCaches;
import com.google.idea.blaze.base.model.BlazeProjectData;
import com.google.idea.blaze.base.model.primitives.Label;
import com.google.idea.blaze.base.model.primitives.TargetExpression;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.google.idea.blaze.base.projectview.ProjectViewManager;
import com.google.idea.blaze.base.projectview.ProjectViewSet;
import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
import com.google.idea.blaze.base.scope.BlazeContext;
import com.google.idea.blaze.base.scope.ScopedTask;
import com.google.idea.blaze.base.scope.scopes.BlazeConsoleScope;
import com.google.idea.blaze.base.scope.scopes.IdeaLogScope;
import com.google.idea.blaze.base.scope.scopes.IssuesScope;
import com.google.idea.blaze.base.scope.scopes.NotificationScope;
import com.google.idea.blaze.base.scope.scopes.TimingScope;
import com.google.idea.blaze.base.settings.Blaze;
import com.google.idea.blaze.base.sync.aspects.BlazeIdeInterface;
import com.google.idea.blaze.base.sync.aspects.BuildResult;
import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder;
import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder.ShardedTargetsResult;
import com.google.idea.blaze.base.util.SaveUtil;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import java.util.List;

/** Utility to build various collections of targets. */
public class BlazeBuildService {
  private static final Key<Long> PROJECT_LAST_BUILD_TIMESTAMP_KEY =
      Key.create("blaze.project.last.build.timestamp");

  public static BlazeBuildService getInstance() {
    return ServiceManager.getService(BlazeBuildService.class);
  }

  public void buildFile(Project project, String fileName, ImmutableCollection<Label> targets) {
    if (project == null || !Blaze.isBlazeProject(project) || fileName == null) {
      return;
    }
    buildTargetExpressions(
        project,
        Lists.newArrayList(targets),
        ProjectViewManager.getInstance(project).getProjectViewSet(),
        new NotificationScope(
            project,
            "Make",
            "Make " + fileName,
            "Make " + fileName + " completed successfully",
            "Make " + fileName + " failed"));
  }

  public void buildProject(Project project) {
    if (project == null || !Blaze.isBlazeProject(project)) {
      return;
    }
    ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
    if (projectViewSet == null) {
      return;
    }
    buildTargetExpressions(
        project,
        projectViewSet.listItems(TargetSection.KEY),
        projectViewSet,
        new NotificationScope(
            project,
            "Make",
            "Make project",
            "Make project completed successfully",
            "Make project failed"));

    // In case the user touched a file, but didn't change its content. The user will get a false
    // positive for class file out of date. We need a way for the user to suppress the false
    // message. Clicking the "build project" link should at least make the message go away.
    project.putUserData(PROJECT_LAST_BUILD_TIMESTAMP_KEY, System.currentTimeMillis());
  }

  public static Long getLastBuildTimeStamp(Project project) {
    return project.getUserData(PROJECT_LAST_BUILD_TIMESTAMP_KEY);
  }

  @VisibleForTesting
  void buildTargetExpressions(
      Project project,
      List<TargetExpression> targets,
      ProjectViewSet projectViewSet,
      NotificationScope notificationScope) {
    if (targets.isEmpty() || projectViewSet == null) {
      return;
    }
    BlazeProjectData blazeProjectData =
        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
    if (blazeProjectData == null) {
      return;
    }
    BlazeExecutor.submitTask(
        project,
        new ScopedTask() {
          @Override
          public void execute(BlazeContext context) {
            context
                .push(new ExperimentScope())
                .push(new BlazeConsoleScope.Builder(project).build())
                .push(new IssuesScope(project))
                .push(new IdeaLogScope())
                .push(new TimingScope("Make"))
                .push(notificationScope);

            WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);

            SaveUtil.saveAllFiles();
            ShardedTargetsResult shardedTargets =
                BlazeBuildTargetSharder.expandAndShardTargets(
                    project,
                    context,
                    workspaceRoot,
                    projectViewSet,
                    blazeProjectData.workspacePathResolver,
                    targets);
            if (shardedTargets.buildResult.status == BuildResult.Status.FATAL_ERROR) {
              return;
            }
            BuildResult buildResult =
                BlazeIdeInterface.getInstance()
                    .compileIdeArtifacts(
                        project,
                        context,
                        workspaceRoot,
                        projectViewSet,
                        blazeProjectData.blazeVersionData,
                        blazeProjectData.workspaceLanguageSettings,
                        shardedTargets.shardedTargets);
            FileCaches.refresh(project);

            if (buildResult.status != BuildResult.Status.SUCCESS) {
              context.setHasError();
            }
          }
        });
  }
}
