package com.airhacks.ping.control;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.time.ZonedDateTime;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.json.Json;
import javax.json.JsonObject;

/**
 *
 * @author airhacks.com
 */
@Startup
@Singleton
public class ServerWatch {

    private ZonedDateTime startTime;
    private MemoryUsage heapUsageAtStartTime;
    private MemoryMXBean memoryMxBean;

    @PostConstruct
    public void initialize() {
        this.initializeStartTime();
        this.memoryMxBean = ManagementFactory.getMemoryMXBean();
        this.heapUsageAtStartTime = this.memoryMxBean.getHeapMemoryUsage();

    }

    void initializeStartTime() {
        this.startTime = ZonedDateTime.now();
    }

    public ZonedDateTime getDateTime() {
        return this.startTime;
    }

    public double availableMemoryInMB() {
        MemoryUsage current = this.memoryMxBean.getHeapMemoryUsage();
        long available = (current.getCommitted() - current.getUsed());
        return asMb(available);
    }

    public double usedMemoryInMb() {
        MemoryUsage current = this.memoryMxBean.getHeapMemoryUsage();
        return asMb(current.getUsed());
    }

    public String usedMemoryInMbAtStartTime() {
        return this.heapUsageAtStartTime.toString();
    }

    public JsonObject osInfo() {
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        return Json.createObjectBuilder().
                add("System Load Average", osBean.getSystemLoadAverage()).
                add("Available CPUs", osBean.getAvailableProcessors()).
                add("Architecture", osBean.getArch()).
                add("OS Name", osBean.getName()).
                add("Version", osBean.getVersion()).build();

    }

    double asMb(long bytes) {
        return bytes / 1024 / 1024;
    }

}