package org.apache.s4.comm.helix;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.helix.NotificationContext;
import org.apache.helix.model.Message;
import org.apache.helix.participant.statemachine.StateModel;
import org.apache.helix.participant.statemachine.StateModelInfo;
import org.apache.helix.participant.statemachine.Transition;

@StateModelInfo(states = { "LEADER,STANDBY" }, initialState = "OFFLINE")
public class S4StateModel extends StateModel {
    private static Logger logger = LoggerFactory.getLogger(S4StateModel.class);

    private final String streamName;
    private final String partitionId;

    public S4StateModel(String partitionName) {
        String[] parts = partitionName.split("_");
        this.streamName = parts[0];
        this.partitionId = parts[1];
    }

    @Transition(from = "OFFLINE", to = "STANDBY")
    public void becomeLeaderFromOffline(Message msg, NotificationContext context) {
        logger.info("Transitioning from " + msg.getFromState() + " to " + msg.getToState() + "for "
                + msg.getPartitionName());
    }

    @Transition(from = "STANDBY", to = "LEADER")
    public void becomeLeaderFromStandby(Message msg, NotificationContext context) {
        logger.info("Transitioning from " + msg.getFromState() + " to " + msg.getToState() + "for "
                + msg.getPartitionName());
    }

    @Transition(from = "LEADER", to = "STANDBY")
    public void becomeStandbyFromLeader(Message msg, NotificationContext context) {
        logger.info("Transitioning from " + msg.getFromState() + " to " + msg.getToState() + "for "
                + msg.getPartitionName());
    }

    @Transition(from = "STANDBY", to = "OFFLINE")
    public void becomeOfflineFromStandby(Message msg, NotificationContext context) {
        logger.info("Transitioning from " + msg.getFromState() + " to " + msg.getToState() + "for "
                + msg.getPartitionName());
    }

    @Transition(from = "OFFLINE", to = "DROPPED")
    public void dropPartition(Message msg, NotificationContext context) {
        logger.info("Dropping partition" + msg.getPartitionName());
    }

}
