package engine.net.client.handlers;

import engine.Enum;
import engine.Enum.DispatchChannel;
import engine.exception.MsgSendException;
import engine.gameManager.SessionManager;
import engine.gameManager.ZoneManager;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import engine.session.Session;

/*
 * @Author:
 * @Summary: Processes application protocol message which displays
 * the map interface.  (Zones, Cities, Realms, Hot-zones)
 */

public class CityDataHandler extends AbstractClientMsgHandler {

    public CityDataHandler() {
        super(KeepAliveServerClientMsg.class);
    }

    @Override
    protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {

        boolean updateCities = false;
        Session playerSession;
        PlayerCharacter playerCharacter;
        Dispatch dispatch;

        playerCharacter = origin.getPlayerCharacter();

        if (playerCharacter == null)
            return true;

        // Session is needed as param for worldObjectMsg.

        playerSession = SessionManager.getSession(playerCharacter);

        if (playerSession == null)
            return true;

        // No reason to serialize cities everytime map is
        // opened.  Wait until something has changed.
        // This does not work for mines.

        if (playerCharacter.getTimeStamp("cityUpdate") <= City.lastCityUpdate) {
            playerCharacter.setTimeStamp("cityUpdate", System.currentTimeMillis());
            updateCities = true;
        }

        CityDataMsg cityDataMsg = new CityDataMsg(SessionManager.getSession(playerCharacter), false);
        cityDataMsg.updateMines(true);
        cityDataMsg.updateCities(updateCities);

        dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
        DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);

        // If the hotZone has changed then update the client's map accordingly.

        if (playerCharacter.getTimestamps().containsKey("hotzoneupdate") && playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
            HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
            dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
            DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
            playerCharacter.setTimeStamp("hotzoneupdate", System.currentTimeMillis() - 100);
        }

        // Serialize the realms for this map

        WorldRealmMsg worldRealmMsg = new WorldRealmMsg();
        dispatch = Dispatch.borrow(playerCharacter, worldRealmMsg);
        DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);

        return true;
    }

}