/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.falcon.rerun.event;

import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * Event representing a rerun.
 */
@edu.umd.cs.findbugs.annotations.SuppressWarnings({"EQ_COMPARETO_USE_OBJECT_EQUALS"})
public class RerunEvent implements Delayed {

    protected static final String SEP = "*";

    /**
     * Rerun Event type.
     */
    public enum RerunType {
        RETRY, LATE
    }

    protected String clusterName;
    protected String wfId;
    protected String workflowUser;
    protected long msgInsertTime;
    protected long delayInMilliSec;
    protected String entityType;
    protected String entityName;
    protected String instance;
    protected int runId;

    //SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
    public RerunEvent(String clusterName, String wfId, long msgInsertTime, long delay,
                      String entityType, String entityName, String instance, int runId, String workflowUser) {
        this.clusterName = clusterName;
        this.wfId = wfId;
        this.workflowUser = workflowUser;
        this.msgInsertTime = msgInsertTime;
        this.delayInMilliSec = delay;
        this.entityName = entityName;
        this.instance = instance;
        this.runId = runId;
        this.entityType = entityType;
    }
    //RESUME CHECKSTYLE CHECK ParameterNumberCheck

    public String getClusterName() {
        return clusterName;
    }

    public String getWfId() {
        return wfId;
    }

    public String getWorkflowUser() {
        return workflowUser;
    }

    public long getDelayInMilliSec() {
        return delayInMilliSec;
    }

    public String getEntityName() {
        return entityName;
    }

    public String getInstance() {
        return instance;
    }

    public int getRunId() {
        return runId;
    }

    public String getEntityType() {
        return entityType;
    }


    @Override
    public int compareTo(Delayed o) {
        RerunEvent event = (RerunEvent) o;
        return new Date(msgInsertTime + delayInMilliSec).
                compareTo(new Date(event.msgInsertTime + event.delayInMilliSec));
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert((msgInsertTime - System.currentTimeMillis())
                + delayInMilliSec, TimeUnit.MILLISECONDS);
    }

    public long getMsgInsertTime() {
        return msgInsertTime;
    }

    public void setMsgInsertTime(long msgInsertTime) {
        this.msgInsertTime = msgInsertTime;
    }

    public RerunType getType() {
        if (this instanceof RetryEvent) {
            return RerunType.RETRY;
        } else if (this instanceof LaterunEvent) {
            return RerunType.LATE;
        } else {
            return null;
        }
    }
}
