package com.teltonikaServer.persistence;

import java.io.IOException;
import java.util.logging.*;

import com.teltonikaServer.network.TCPServer;

public class AppLogger {

    private final Logger logger;
    private final String logFile;

    public AppLogger(String filename) {
        this.logFile = filename;
        this.logger = Logger.getLogger(ApplicationLogger.class.getName());
        try {
            FileHandler fileHandler = new FileHandler(this.logFile, true);
            fileHandler.setFormatter(new CustomFormatter());
            logger.addHandler(fileHandler);
            logger.setUseParentHandlers(false); // Evita duplicar logs en consola
        } catch (IOException e) {
            logger.log(Level.SEVERE, "Error al configurar el archivo de log", e);
        }
    }

    public synchronized void logEvent(Level level, String errorMessage) {
        if(((TCPServer.VERBOSITY & TCPServer.VERB_INFO) > 0) && level == Level.INFO){
            logger.log(level, errorMessage);
        }
        if(((TCPServer.VERBOSITY & TCPServer.VERB_FINE) > 0) && level == Level.FINE){
            logger.log(level, errorMessage);
        }
        if(((TCPServer.VERBOSITY & TCPServer.VERB_WARNING) > 0) && level == Level.WARNING){
            logger.log(level, errorMessage);
        }
        if(((TCPServer.VERBOSITY & TCPServer.VERB_FINE) > 0) && (level == Level.FINEST || level == Level.FINER || level == Level.FINEST)){
            logger.log(level, errorMessage);
        }
        if(((TCPServer.VERBOSITY & TCPServer.VERB_SEVERE) > 0) && (level == Level.SEVERE)){
            logger.log(level, errorMessage);
        } 
    }

    private static class CustomFormatter extends Formatter {
        @Override
        public String format(LogRecord record) {
            return String.format(
                "[%s] [%s] [%s] %s%n",
                java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")),
                record.getLevel(),
                record.getLoggerName(),
                record.getMessage()
            );
        }
    }

    public static void main(String[] args) {
        ApplicationLogger sampleLog = new ApplicationLogger("sample.log");
        sampleLog.logEvent(Level.WARNING, "Se ha producido un error crítico en la aplicación.");
    }
}
