import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) {
        // Путь к папке с файлами .cs
        String folderPath = "B:\\Новая папка";
        // Имя выходного файла
        String outputFilePath = "output.txt";

        // Проверяем существование исходной директории
        Path sourceDir = Paths.get(folderPath);
        if (!Files.exists(sourceDir)) {
            System.err.println("Указанная директория не существует: " + folderPath);
            return;
        }

        // Создаем объект для записи результатов
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(outputFilePath), StandardCharsets.UTF_8))) {

            // Рекурсивный обход всех файлов с расширением .cs в указанной директории
            try (Stream<Path> paths = Files.walk(sourceDir)) {
                paths.filter(path -> path.toString().endsWith(".java")) // Фильтруем файлы по расширению .cs
                        .forEach(path -> processFile(writer, path));      // Обработка каждого найденного файла

                System.out.println("Файлы успешно объединены и сохранены в " + outputFilePath);
            } catch (IOException e) {
                System.err.println("Ошибка при обработке файлов в директории: " + folderPath);
                e.printStackTrace();
            }
        } catch (IOException e) {
            System.err.println("Ошибка при создании/открытии выходного файла: " + outputFilePath);
            e.printStackTrace();
        }
    }

    private static void processFile(BufferedWriter writer, Path filePath) {
        try {
            // Читаем содержимое файла
            List<String> lines = Files.readAllLines(filePath, StandardCharsets.UTF_8)
                    .stream()
                    .filter(line -> !line.trim().isEmpty()) // Убираем пустые строки
                    .map(line -> line.replace("\t", ""))   // Удаление табуляций
                    .collect(Collectors.toList());

            // Добавляем название файла перед его содержимым
            writer.write("// " + filePath.getFileName() + "\n");
            for (String line : lines) {
                writer.write(line + "\n");
            }
            writer.newLine(); // Добавляем пустую строку между содержимым разных файлов

        } catch (IOException e) {
            System.err.println("Ошибка при чтении файла: " + filePath);
            e.printStackTrace();
        }
    }
}
