// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming;

import com.android.tools.r8.SourceFileEnvironment;
import com.android.tools.r8.SourceFileProvider;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.shaking.ProguardConfiguration;
import com.android.tools.r8.utils.InternalOptions;

/** Computes the source file provider based on the proguard configuration if none is set. */
public class SourceFileRewriter {

  public static SourceFileProvider computeSourceFileProvider(
      SourceFileProvider provider, ProguardConfiguration configuration, InternalOptions options) {
    if (provider != null) {
      return provider;
    }
    if (!configuration.getKeepAttributes().sourceFile) {
      return rewriteToDefaultSourceFile(options.dexItemFactory());
    }
    if (options.forceProguardCompatibility) {
      return computeCompatProvider(options);
    }
    return computeNonCompatProvider(options);
  }

  private static SourceFileProvider computeCompatProvider(InternalOptions options) {
    // Compatibility mode will only apply -renamesourcefileattribute when minifying names.
    if (options.isMinifying()) {
      String renaming = getRenameSourceFileAttribute(options);
      if (renaming != null) {
        return rewriteTo(renaming, isDefault(renaming, options));
      }
    }
    return null;
  }

  private static SourceFileProvider computeNonCompatProvider(InternalOptions options) {
    String renaming = getRenameSourceFileAttribute(options);
    if (renaming != null) {
      return rewriteTo(renaming, isDefault(renaming, options));
    }
    if (options.isMinifying() || options.isOptimizing()) {
      return rewriteToDefaultSourceFile(options.dexItemFactory());
    }
    return null;
  }

  private static String getRenameSourceFileAttribute(InternalOptions options) {
    return options.getProguardConfiguration().getRenameSourceFileAttribute();
  }

  public static boolean isDefault(String sourceFile, InternalOptions options) {
    return options.dexItemFactory().defaultSourceFileAttributeString.equals(sourceFile);
  }

  private static SourceFileProvider rewriteToDefaultSourceFile(DexItemFactory factory) {
    return rewriteTo(factory.defaultSourceFileAttributeString, true);
  }

  private static SourceFileProvider rewriteTo(String renaming, boolean allowDiscard) {
    return new SourceFileProvider() {
      @Override
      public String get(SourceFileEnvironment environment) {
        return renaming;
      }

      @Override
      public boolean allowDiscardingSourceFile() {
        return allowDiscard;
      }
    };
  }
}
