/*-
 * ~~~~~~licensing~~~~~~
 * cef-logger-layout
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
package ru.emdev.cef;

import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.AppenderControl;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.plugins.*;

import java.util.ArrayList;
import java.util.List;

@Plugin(name = "CEFAggregate", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
public class CEFAppender extends AbstractAppender {

    private final Configuration config;
    private final String children;
    private final List<AppenderControl> controls = new ArrayList<>();

    private CEFAppender(String name, Filter filter, String children, Configuration config, Boolean ignoreExceptions) {
        super(name, filter, null, ignoreExceptions, null);
        this.config = config;
        this.children = children;
    }

    @Override
    public void start() {
        String[] refs = children.split(",");
        for (String ref : refs) {
            String cleaned = ref.trim();
            Appender appender = config.getAppender(cleaned);
            if (appender != null) {
                controls.add(new AppenderControl(appender, null, null));
            }
        }
        super.start();
    }

    @Override
    public void append(LogEvent event) {
        String formattedMessage = event.getMessage().getFormattedMessage();
        boolean skipMessage = formattedMessage.startsWith("GET /") || formattedMessage.startsWith("POST /");
        if (!skipMessage) {
            for (AppenderControl control : controls) {
                control.callAppender(event);
            }
        }
    }

    @PluginFactory
    public static CEFAppender createAppender(
            @PluginAttribute("name") final String name,
            @PluginAttribute("children") final String children,
            @PluginElement("Filter") final Filter filter,
            @PluginConfiguration final Configuration config
    ) {
        if (children == null) {
            throw new IllegalArgumentException("`children` key cannot be null");
        }
        return new CEFAppender(name, filter, children, config, false);
    }
}
