package uk.tim740.skUtilities.files;

import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.util.Kleenean;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import uk.tim740.skUtilities.files.event.EvtUnzip;
import uk.tim740.skUtilities.skUtilities;

import javax.annotation.Nullable;
import java.io.IOException;
import java.net.URI;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by tim740 on 19/03/2016
 */
public class EffUnzip extends Effect {
  private Expression<String> file, zip;

  @Override
  protected void execute(Event e) {
    Path Fzip = Paths.get(skUtilities.getDefaultPath(zip.getSingle(e)));
    Path pth = Paths.get(skUtilities.getDefaultPath(file.getSingle(e)));
    EvtUnzip euz = new EvtUnzip(Fzip, pth.toString());
    Bukkit.getServer().getPluginManager().callEvent(euz);
    if (!euz.isCancelled()) {
      try {
        final Map<String, String> env = new HashMap<>();
        env.put("create", "true");
        if (Files.notExists(pth)) {
          Files.createDirectories(pth);
        }
        try (FileSystem zfs = FileSystems.newFileSystem(URI.create("jar:file:/" + Fzip.normalize().toAbsolutePath().toString().replace("\\", "/")), env)) {
          Files.walkFileTree(zfs.getPath("/"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path ftc, BasicFileAttributes ats) throws IOException {
              Files.copy(ftc, Paths.get(pth.toString(), ftc.toString()), StandardCopyOption.REPLACE_EXISTING);
              return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes ats) throws IOException {
              final Path dtc = Paths.get(pth.toString(), dir.toString());
              if (Files.notExists(dtc)) {
                Files.createDirectory(dtc);
              }
              return FileVisitResult.CONTINUE;
            }
          });
        }
      } catch (Exception x) {
        skUtilities.prSysE("ZipFile: '" + Fzip + "' doesn't exist, or doesn't have write permission!", getClass().getSimpleName(), x);
      }
    }
  }

  @SuppressWarnings("unchecked")
  @Override
  public boolean init(Expression<?>[] e, int i, Kleenean k, SkriptParser.ParseResult p) {
    zip = (Expression<String>) e[0];
    file = (Expression<String>) e[1];
    return true;
  }

  @Override
  public String toString(@Nullable Event e, boolean b) {
    return getClass().getName();
  }
}