/*
 * 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.example;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.util.HashMap;
import java.util.Map;

/** Creates a zip file with entries for Main.java and Yang.java. */
public class Zip {

  /** @param args Should contain one value, which is a path to a zip file to be written. */
  public static void main(String[] args) throws IOException {
    if (args.length < 1) {
      System.err.println("Usage Zip target");
      return;
    }
    String target = args[0];
    URI uri = URI.create("jar:" + new File(target).toURI());
    Map<String, String> env = new HashMap<>(); 
    env.put("create", "true");
    try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
      Files.write(zipfs.getPath("/Main.java"), MAIN_JAVA.getBytes());
      Files.write(zipfs.getPath("/Yang.java"), YANG_JAVA.getBytes());
    }
  }

  private static String join(String... values) {
    StringBuilder out = new StringBuilder();
    int max = values.length - 1;
    for (int i = 0; i < max; i++) {
      out.append(values[i]).append('\n');
    }
    out.append(values[max]);
    return out.toString();
  }

  private static final String MAIN_JAVA = join(
    "package com.example;",
    "",
    "public class Main {",
    "",
    "  public static void main(String... args) {",
    "    Yin yin = new Yin();",
    "    Yang yang = new Yang();",
    "    yin.setYang(yang);",
    "    yang.setYin(yin);",
    "  }",
    "}"
  );

  private static final String YANG_JAVA = join(
    "package com.example;",
    "",
    "public class Yang {",
    "",
    "  private Yin yin;",
    "",
    "  public void setYin(Yin yin) {",
    "    this.yin = yin;",
    "  }",
    "",
    "  public Yin getYin() {",
    "    return yin;",
    "  }",
    "}"
  );
}
