/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.rules;

import com.google.common.base.Preconditions;
import com.google.common.io.Files;

import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;

public class DirArtifactCache implements ArtifactCache {
  private final static Logger logger = Logger.getLogger(DirArtifactCache.class.getName());

  private final File cacheDir;

  public DirArtifactCache(File cacheDir) throws IOException {
    this.cacheDir = Preconditions.checkNotNull(cacheDir);
    Files.createParentDirs(cacheDir);
    if (!cacheDir.mkdir() && !cacheDir.exists()) {
      throw new IOException(String.format("Failed to create cache directory: \"%s\"",
          cacheDir.getPath()));
    }
  }

  @Override
  public CacheResult fetch(RuleKey ruleKey, File output) {
    CacheResult success = CacheResult.MISS;
    File cacheEntry = new File(cacheDir, ruleKey.toString());
    if (cacheEntry.exists()) {
      try {
        Files.createParentDirs(output);
        Files.copy(cacheEntry, output);
        success = CacheResult.DIR_HIT;
      } catch (IOException e) {
        logger.warning(String.format("Artifact fetch(%s, %s) error: %s",
            ruleKey,
            output.getPath(),
            e.getMessage()));
      }
    }
    logger.info(String.format("Artifact fetch(%s, %s) cache %s",
        ruleKey,
        output.getPath(),
        (success.isSuccess() ? "hit" : "miss")));
    return success;
  }

  @Override
  public void store(RuleKey ruleKey, File output) {
    File cacheEntry = new File(cacheDir, ruleKey.toString());
    File tmpCacheEntry = null;
    try {
      // Write to a temporary file and move the file to its final location atomically to protect
      // against partial artifacts (whether due to buck interruption or filesystem failure) posing
      // as valid artifacts during subsequent buck runs.
      tmpCacheEntry = File.createTempFile(ruleKey.toString(), ".tmp", cacheDir);
      Files.copy(output, tmpCacheEntry);
      Files.move(tmpCacheEntry, cacheEntry);
    } catch (IOException e) {
      logger.warning(String.format("Artifact store(%s, %s) error: %s",
          ruleKey,
          output.getPath(),
          e.getMessage()));
      if (tmpCacheEntry != null) {
        tmpCacheEntry.delete();
      }
    }
  }
}
