package admin.obfcode;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ObfJ {

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String put_dir = sc.nextLine();

        BufferedReader reader = new BufferedReader(new FileReader("src/admin/obfcode/name_project.txt"));
        String line;
        ArrayList<String> mas_name = new ArrayList<>();
        while ((line = reader.readLine()) != null) {
            mas_name.add(line);
        }

        ArrayList<String> mas_rnd = new ArrayList<>();
        for (int i = 0; i < mas_name.size(); i++) {
            mas_rnd.add(generateRandomString());
        }

        // Укажите путь к директории, которую нужно просканировать
        String directoryPath = put_dir; // "/home/nick/Рабочий стол/Папка"
        File directory = new File(directoryPath);

        if (directory.exists() && directory.isDirectory()) {
            for (int i = 0; i < mas_name.size(); i++) {
                processDirectory(directory, mas_name.get(i), mas_rnd.get(i));
            }
            for (int i = 0; i < mas_name.size(); i++) {
                obfDir(directory, mas_name.get(i), mas_rnd.get(i));
            }
        } else {
            System.out.println("Указанный путь не является директорией или не существует.");
        }
    }

    private static void processDirectory(File directory, String name, String rnd_name) {
        File[] files = directory.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // Рекурсивно обходим подпапки
                    processDirectory(file, name, rnd_name);
                } else if (file.getName().endsWith(".java")) {
                    // Обрабатываем файл с расширением .java
                    modifyJavaFile(file, name, rnd_name);
                }
            }
        }
    }

    private static void modifyJavaFile(File file, String name, String rnd_name) {

        File tempFile = new File(file.getAbsolutePath() + ".tmp");

        try (BufferedReader reader = new BufferedReader(new FileReader(file));
             BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile))) {

            String line;
            while ((line = reader.readLine()) != null) {
                if (name.startsWith("get")) {
                    line = line.replace(name, "get"+rnd_name);
                }
                String regex = "\\b" + name + "\\b";    // comit
                Pattern pattern = Pattern.compile(regex); // comit
                Matcher matcher = pattern.matcher(line); // comit
                if (matcher.find()) {                    // comit
                    line = line.replace(name, rnd_name);
                }                                       // comit
                writer.write(line);
                writer.newLine();
            }

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

        // Переименовываем временный файл в оригинальное имя
        if (!file.delete()) {
            System.err.println("Не удалось удалить оригинальный файл: " + file.getAbsolutePath());
        }
        if (!tempFile.renameTo(file)) {
            System.err.println("Не удалось переименовать временный файл: " + tempFile.getAbsolutePath());
        }
        if (file.getName().equals(name+".java")) {
            fileObf(file, name, rnd_name);
        }
    }



    // rndName
    private static String generateRandomString() {
        String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        Random RANDOM = new Random();

        int length = RANDOM.nextInt(27) + 15;

        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int index = RANDOM.nextInt(CHARACTERS.length());
            sb.append(CHARACTERS.charAt(index));
        }
        return sb.toString();
    }


    public static void fileObf(File oldFile, String name, String rnd_name) {
        try {
            //File oldFile = new File("/home/nick/Рабочий стол/Папка/Mama.java");
            //String name = "Mama";
            //String rnd_name = "may";

            // Проверяем, существует ли файл и является ли он файлом
            if (oldFile.exists() && oldFile.isFile()) {
                // Получаем имя без расширения
                String fileNameWithoutExtension = getFileNameWithoutExtension(oldFile.getName());
                if (fileNameWithoutExtension.equals(name)) {
                    Path testFilePath = Paths.get(String.valueOf(oldFile));
                    BufferedReader br = new BufferedReader(new FileReader(oldFile));
                    String l;
                    String otv = "";
                    while ((l = br.readLine()) != null) {
                        otv += l + "\n";
                    }
                    oldFile.delete();

                    String new_file = testFilePath.getParent() + "/" + rnd_name + ".java";
                    System.out.println(new_file);
                    if (!new File(new_file).exists()) {
                        new File(new_file).createNewFile();
                    }
                    PrintWriter pw = new PrintWriter(new_file);
                    pw.println(otv);
                    pw.close();
                }
            } else {
                System.out.println("Файл не найден или это не файл.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static String getFileNameWithoutExtension(String fileName) {
        int lastIndexOfDot = fileName.lastIndexOf('.');
        if (lastIndexOfDot == -1) {
            return fileName; // Если нет расширения, возвращаем полное имя
        }
        return fileName.substring(0, lastIndexOfDot);
    }


    private static void obfDir(File dir, String old_name, String new_name) {
        // Получаем список всех файлов и папок в текущей директории
        File[] files = dir.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isDirectory() && file.getName().equals(old_name)) {
                    File newDir = new File(file.getParent(), new_name);
                    if (file.renameTo(newDir)) {
                        System.out.println("Папка переименована: " + file.getAbsolutePath() + " -> " + newDir.getAbsolutePath());
                    } else {
                        System.out.println("Не удалось переименовать папку: " + file.getAbsolutePath());
                    }
                }
                // Рекурсивно вызываем метод для вложенных директорий
                if (file.isDirectory()) {
                    obfDir(file, old_name, new_name);
                }
            }
        }
    }
}
