import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

public class LogRotationTest {
    private static final Logger logger = Logger.getLogger(LogRotationTest.class.getName());
    private static final int MAX_LOG_SIZE = 1024 * 4; // 2KB for quick rotation
    private static final int MAX_BACKUP_INDEX = 3;
    private static final String LOG_FILE_NAME = "log_0.log";
    private static FileHandler fileHandler;
    private static int logCounter = 0;

    public static void main(String[] args) throws Exception {
        setupLogger();

        Thread loggingThread = new Thread(() -> {
            try {
                logMessages();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        loggingThread.start();
        loggingThread.join();
    }

    private static void setupLogger() throws IOException {
        // Ensure old logs are deleted for clean runs
        for (int i = 0; i <= MAX_BACKUP_INDEX; i++) {
            File f = new File("log_" + i + ".log");
            if (f.exists()) f.delete();
        }

        fileHandler = new FileHandler(LOG_FILE_NAME, true);
        fileHandler.setFormatter(new SimpleFormatter());
        logger.addHandler(fileHandler);
        logger.setUseParentHandlers(false);
        logger.setLevel(Level.INFO);

        System.out.println("🛠️ Logger initialized, writing to " + LOG_FILE_NAME);
    }

    private static void logMessages() throws Exception {
        while (logCounter < 40) {
            logger.info("Thread: " + Thread.currentThread().getName() + 
            " | Logging message " + logCounter + 
            " - " + "X".repeat(300));
           fileHandler.flush();
            System.out.println("💾 Log written. File size: " + new File(LOG_FILE_NAME).length());

            checkAndRotate();

            Thread.sleep(500);
            logCounter++;
        }
    }

    private static void checkAndRotate() throws IOException {
        File logFile = new File(LOG_FILE_NAME);
        if (logFile.length() >= MAX_LOG_SIZE) {
            System.out.println("🔁 Rotating logs... Log size: " + logFile.length());

            // Close current file handler before renaming
            fileHandler.close();
            logger.removeHandler(fileHandler);

            // Rename old files
            for (int i = MAX_BACKUP_INDEX - 1; i >= 0; i--) {
                File src = new File("log_" + i + ".log");
                File dest = new File("log_" + (i + 1) + ".log");

                if (src.exists()) {
                    boolean renamed = src.renameTo(dest);
                    System.out.println("🔄 Renaming log_" + i + ".log → log_" + (i + 1) + ".log: " + renamed);
                    if (!renamed) {
                        System.out.println("❌ Rename failed for log_" + i + ".log");
                    }
                }
            }

            // Create new log_0
            fileHandler = new FileHandler(LOG_FILE_NAME, true);
            fileHandler.setFormatter(new SimpleFormatter());
            logger.addHandler(fileHandler);
            System.out.println("✅ Created new log_0.log after rotation.");
        }
    }
}

