package jnet.server.probe;

import jnet.lib.Message;
import jnet.lib.Status;
import jnet.lib.object.Event;
import jnet.lib.object.MapObject;
import jnet.server.Database;
import jnet.server.Server;
import jnet.server.ServerMessageParser;

public class PingResult {

    private static final int POKUS = Server.config.getInt("ping_attempt");

    public static void stateOnline(MapObject obj) {
        // oveří jestli neni zarizeni vypnuto
        if (obj.isActive() && obj.getStatus() != Status.OK) {
            // vynuluje ping pokusy 
            obj.setPingAttemp(0);
            // pokud byl předchozí stav offline ukončí event
            if (obj.getStatus() == Status.OFFLINE) {
                // aktualizace eventu
                Event event = Database.endEvent(obj.getId(), Event.TYPE_PING);
                for (int i = 0; i < Server.events.size(); i++) {
                    if (Server.events.get(i).getId() == event.getId()) {
                        Server.events.set(i, event);
                    }
                }
                // odeslani aktualizovaného eventu
                ServerMessageParser.sendAll(Message.EVENT_UPDATE, event);
            }

            // nastavi status objektu
            obj.setStatus(Status.OK);
            // odesle informaci o novem stavu klientum
            sendState(obj.getId(), Status.OK);
        }
    }

    public static void stateOffline(MapObject obj) {
        // oveří jestli neni zarizeni vypnuto
        if (obj.isActive()) {
            if (obj.getPingAttemp() >= POKUS && obj.getStatus() != Status.OFFLINE) {
                System.err.println("objekt: " + obj.getName() + " pokus: " + obj.getPingAttemp());
                // nastavi status objektu
                obj.setStatus(Status.OFFLINE);
                // odesle informaci o novem stavu klientum
                sendState(obj.getId(), Status.OFFLINE);
                // pridáni eventu
                Event event = Database.addEvent(obj.getId(), "Offline", Event.TYPE_PING);
                Server.events.add(event);
                // Odeslani eventu klientum
                ServerMessageParser.sendAll(new Message(Message.EVENT_NEW, event));
            } else {
                obj.pingAttemp++;
            }

        }
    }

    private static void sendState(int object, int state) {
        int[] o = {object, state};
        ServerMessageParser.sendAll(new Message(Message.STATUS_UPDATE, o));
    }

}
