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

import com.google.common.collect.ImmutableSet;
import com.google.idea.blaze.base.model.BlazeProjectData;
import com.google.idea.blaze.base.model.primitives.LanguageClass;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.google.idea.blaze.base.model.primitives.WorkspaceType;
import com.google.idea.blaze.base.projectview.ProjectViewSet;
import com.google.idea.blaze.base.scope.BlazeContext;
import com.google.idea.blaze.base.scope.Scope;
import com.google.idea.blaze.base.scope.scopes.TimingScope;
import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.jetbrains.cidr.lang.workspace.OCWorkspace;
import com.jetbrains.cidr.lang.workspace.OCWorkspaceManager;

import javax.annotation.Nullable;
import java.util.Set;

public final class BlazeCSyncPlugin extends BlazeSyncPlugin.Adapter {
  @Override
  public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
    if (workspaceType == WorkspaceType.C) {
      return ImmutableSet.of(LanguageClass.C);
    }
    return ImmutableSet.of();
  }

  @Override
  public void updateProjectStructure(Project project,
                                     BlazeContext context,
                                     WorkspaceRoot workspaceRoot,
                                     ProjectViewSet projectViewSet,
                                     BlazeProjectData blazeProjectData,
                                     @Nullable BlazeProjectData oldBlazeProjectData,
                                     ModuleEditor moduleEditor,
                                     Module workspaceModule,
                                     ModifiableRootModel workspaceModifiableModel) {
    if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.C)) {
      return;
    }

    Scope.push(context, childContext -> {
      childContext.push(new TimingScope("Setup C Workspace"));

      OCWorkspace workspace = OCWorkspaceManager.getWorkspace(project);
      if (workspace instanceof BlazeCWorkspace) {
        BlazeCWorkspace blazeCWorkspace = (BlazeCWorkspace)workspace;
        blazeCWorkspace.update(childContext, blazeProjectData);
      }
    });
  }
}
