/*
 * Copyright 2013-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.zip;

import com.google.common.io.ByteStreams;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Unzip {

  public static void extractZipFile(String zipFile,
      String destination,
      boolean overwriteExistingFiles) throws IOException {
    // Create output directory if it does not exist
    File folder = new File(destination);
    // TODO UnzipStep could be a CompositeStep with a MakeCleanDirectoryStep for the output dir.
    Files.createDirectories(folder.toPath());

    try (ZipInputStream zip = new ZipInputStream(new FileInputStream(zipFile))) {
      for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
        String fileName = entry.getName();
        File target = new File(folder, fileName);
        if (target.exists() && !overwriteExistingFiles) {
          continue;
        }

        // TODO(mbolin): Keep track of which directories have already been written to avoid
        // making unnecessary Files.createDirectories() calls. In practice, a single zip file will
        // have many entries in the same directory.

        if (entry.isDirectory()) {
          // Create the directory and all its parent directories
          Files.createDirectories(target.toPath());
        } else {
          // Create parent folder
          Files.createDirectories(target.toPath().getParent());
          // Write file
          try (FileOutputStream out = new FileOutputStream(target)) {
            ByteStreams.copy(zip, out);
          }
        }
      }
    }
  }

}
