/*_############################################################################
  _##
  _##  SNMP4J-Agent 3 - AgentAuditPolicy.java
  _##
  _##  Copyright (C) 2005-2026  Frank Fock (SNMP4J.org)
  _##
  _##  Licensed under the Apache License, Version 2.0 (the "License");
  _##  you may not use this file except in compliance with the License.
  _##  You may obtain a copy of the License at
  _##
  _##      http://www.apache.org/licenses/LICENSE-2.0
  _##
  _##  Unless required by applicable law or agreed to in writing, software
  _##  distributed under the License is distributed on an "AS IS" BASIS,
  _##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  _##  See the License for the specific language governing permissions and
  _##  limitations under the License.
  _##
  _##########################################################################*/

package org.snmp4j.agent.io;

import org.snmp4j.agent.audit.AgentAuditPolicy;
import org.snmp4j.agent.audit.FileAuditEvent;
import org.snmp4j.cfg.EngineBootsCounterFile;
import org.snmp4j.log.LogAdapter;
import org.snmp4j.log.LogFactory;

import java.io.File;

public class AgentEngineBootsCounterFile extends EngineBootsCounterFile {

    private static final LogAdapter logger = LogFactory.getLogger(AgentEngineBootsCounterFile.class);

    private final AgentAuditPolicy auditPolicy;

    /**
     * Creates the boot counter by using the specified file.
     *
     * @param bootCounterFile a file (does not have to exist yet but must be writable).
     * @param auditPolicy     the audit policy to use.
     */
    public AgentEngineBootsCounterFile(File bootCounterFile, AgentAuditPolicy auditPolicy) {
        super(bootCounterFile);
        this.auditPolicy = auditPolicy;
    }

    @Override
    protected void setEngineBoots(int engineBoots) {
        if (auditPolicy != null) {
            if (!auditPolicy.fileAudit(
                    new FileAuditEvent(this, FileAuditEvent.FileOperation.WRITE, super.getBootCounterFile()))) {
                logger.error("Failed to audit file write operation for boot counter file: " + super.getBootCounterFile());
                return;
            }
        }
        super.setEngineBoots(engineBoots);
    }

    @Override
    protected int getLastEngineBoots() {
        if (auditPolicy != null) {
            if (!auditPolicy.fileAudit(
                    new FileAuditEvent(this, FileAuditEvent.FileOperation.READ, super.getBootCounterFile()))) {
                logger.error("Failed to audit file read operation for boot counter file: " + super.getBootCounterFile());
                return 0;
            }
        }
        return super.getLastEngineBoots();
    }
}
