/*
 * 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.java.sync.projectstructure;

import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import com.google.idea.blaze.java.sync.model.BlazeContentEntry;
import com.google.idea.blaze.java.sync.model.BlazeJavaImportResult;
import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.io.URLUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.java.JavaResourceRootType;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.module.JpsModuleSourceRoot;

import java.io.File;
import java.util.Collection;
import java.util.Map;

public class SourceFolderEditor {
  private static final Logger LOG = Logger.getInstance(SourceFolderEditor.class);

  public static void modifyContentEntries(
    BlazeJavaImportResult importResult,
    Collection<ContentEntry> contentEntries) {

    Map<File, BlazeContentEntry> contentEntryMap = Maps.newHashMap();
    for (BlazeContentEntry contentEntry : importResult.contentEntries) {
      contentEntryMap.put(contentEntry.contentRoot, contentEntry);
    }

    for (ContentEntry contentEntry : contentEntries) {
      VirtualFile virtualFile = contentEntry.getFile();
      if (virtualFile == null) {
        continue;
      }

      File contentRoot = new File(virtualFile.getPath());
      BlazeContentEntry javaContentEntry = contentEntryMap.get(contentRoot);
      if (javaContentEntry != null) {
        for (BlazeSourceDirectory sourceDirectory : javaContentEntry.sources) {
          addSourceFolderToContentEntry(
            contentEntry,
            sourceDirectory
          );
        }
      }
    }
  }

  private static void addSourceFolderToContentEntry(
    ContentEntry contentEntry,
    BlazeSourceDirectory sourceDirectory) {
    File sourceDir = sourceDirectory.getDirectory();

    // Create the source folder
    SourceFolder sourceFolder;
    if (sourceDirectory.getIsResource()) {
      JavaResourceRootType resourceRootType = sourceDirectory.getIsTest()
                                              ? JavaResourceRootType.TEST_RESOURCE
                                              : JavaResourceRootType.RESOURCE;
      sourceFolder = contentEntry.addSourceFolder(pathToUrl(sourceDir.getPath()),
                                                  resourceRootType);
    }
    else {
      sourceFolder = contentEntry
        .addSourceFolder(pathToUrl(sourceDir.getPath()), sourceDirectory.getIsTest());
    }
    JpsModuleSourceRoot sourceRoot = sourceFolder.getJpsElement();
    JpsElement properties = sourceRoot.getProperties();
    if (properties instanceof JavaSourceRootProperties) {
      JavaSourceRootProperties rootProperties = (JavaSourceRootProperties)properties;
      if (sourceDirectory.getIsGenerated()) {
        rootProperties.setForGeneratedSources(true);
      }
      String packagePrefix = sourceDirectory.getPackagePrefix();
      if (!Strings.isNullOrEmpty(packagePrefix)) {
        rootProperties.setPackagePrefix(packagePrefix);
      }
    }
  }

  @NotNull
  private static String pathToUrl(@NotNull String filePath) {
    filePath = FileUtil.toSystemIndependentName(filePath);
    if (filePath.endsWith(".srcjar") || filePath.endsWith(".jar")) {
      return URLUtil.JAR_PROTOCOL + URLUtil.SCHEME_SEPARATOR +
             filePath + URLUtil.JAR_SEPARATOR;
    }
    else if (filePath.contains("src.jar!")) {
      return URLUtil.JAR_PROTOCOL + URLUtil.SCHEME_SEPARATOR +
             filePath;
    }
    else {
      return VfsUtilCore.pathToUrl(filePath);
    }
  }
}
