/*******************************************************************************
 * Copyright (c) 2016 École Polytechnique de Montréal
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.tracecompass.incubator.internal.xaf.core.statemachine.variable.utils;

import org.eclipse.tracecompass.incubator.internal.xaf.core.statemachine.backend.BackendState;
import org.eclipse.tracecompass.incubator.internal.xaf.core.statemachine.backend.BackendStateValue;

/**
 * Element representing a process State
 *
 * @author Raphaël Beamonte
 */
public class State extends InterruptionReason {
    private Long state;
    private String data;

    /**
     * Constructor
     */
    public State() {
        state = 0L;
        data = null;
    }

    /**
     * Constructor
     *
     * @param state The state to represent
     */
    public State(Long state) {
        this.state = state;
        data = null;
    }

    /**
     * Constructor
     *
     * @param backendState The state to represent
     */
    public State(BackendState backendState) {
        this.state = backendState.getValue();
        data = null;
    }

    /**
     * Constructor
     *
     * @param backendStateValue The state to represent
     */
    public State(BackendStateValue backendStateValue) {
        this.state = backendStateValue.getValue();
        data = null;
    }

    /**
     * Constructor
     *
     * @param state The state to represent
     * @param data The data to store along the state
     */
    public State(Long state, String data) {
        this.state = state;
        this.data = data;
    }

    /**
     * @return The backend state value corresponding to the state represented by this object
     */
    public BackendStateValue getValue() {
        return BackendStateValue.getValue(state);
    }

    @Override
    public String getID() {
        return new BackendState(state).getPrintName(data);
    }

    @Override
    public String getShortID() {
        return new BackendState(state).getName();
    }

    @Override
    public String getTaskId() {
        return data.toString();
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || !(o instanceof State)) {
            return false;
        }

        State b = (State)o;
        return getID().equals(b.getID());
    }

    @Override
    public int hashCode() {
        int hash = 13;

        String id = getID();
        hash = 93 * hash + (id != null ? id.hashCode() : 0);

        return hash;
    }

    @Override
    public String toString() {
        return getID();
    }

    @Override
    public int compareTo(InterruptionReason ir) {
        if (ir instanceof State) {
            State s = (State)ir;
            if (state == null) {
                if (s.state == null) {
                    return 0;
                }
                return -1;
            }
            int cmp = state.compareTo(s.state);
            if (cmp == 0) {
                if (data == null) {
                    if (s.data == null) {
                        return 0;
                    }
                    return -1;
                }
                return data.compareTo(s.data);
            }
            return cmp;
        }
        return 0;
    }
}