package com.javarush.task.task31.task3105;

import java.io.*;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/*
Добавление файла в архив
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        String fileName = args[0];
        String zipName = args[1];
        File file = new File(fileName);
        Map<ZipEntry, ByteArrayOutputStream> mapEntries = new HashMap<>();
        try(ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipName))){
            ZipEntry zipEntry;
            while (true){
                zipEntry = zipInputStream.getNextEntry();
                if (zipEntry == null) break;
//Если в архиве есть файл с таким именем, то м его не сохраняем.
                if (zipEntry.getName().equals("new/" + file.getName())) continue;
                int buffSize = 1024;
                byte[] buff = new byte[buffSize];
                int bites = 0;
//Создаем БайтЭррейАутпут для каждого имеющегося ЗипЭнтри
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while((bites=zipInputStream.read(buff,0,buffSize)) != -1) {
                    baos.write(buff,0,bites);
                }
//Добавляем в мапу сочетания: ЗипЭнтри + массив его байт
                mapEntries.put(zipEntry,baos);
            }

            try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipName))){
//создаем новый энтри (с учетом новой папки)
                ZipEntry newDir = new ZipEntry("new/" + file.getName());
                zipOutputStream.putNextEntry(newDir);

//Копируем в новый энтри нужный файл, он в архиве попадает в папку new.
                Files.copy(file.toPath(), zipOutputStream);
//Для всех пар, с сохраненными энтри + их байтами, создаем новые ентри и пришем в них байты
                for (Map.Entry<ZipEntry, ByteArrayOutputStream> entry:mapEntries.entrySet()) {
                    zipOutputStream.putNextEntry(entry.getKey());
                    entry.getValue().writeTo(zipOutputStream);
                }
            }
        }
    }
}