// 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.cloudstack.api;


import org.apache.log4j.Logger;

/**
 * queryAsyncJobResult API command.
 */
public abstract class BaseAsyncCmd extends BaseCmd {

    public static final String ipAddressSyncObject = "ipaddress";
    public static final String networkSyncObject = "network";
    public static final String vpcSyncObject = "vpc";
    public static final String migrationSyncObject = "migration";
    public static final String snapshotHostSyncObject = "snapshothost";
    public static final String gslbSyncObject = "globalserverloadbalancer";
    private static final Logger s_logger = Logger.getLogger(BaseAsyncCmd.class.getName());

    private Object job;

    @Parameter(name = "starteventid", type = CommandType.LONG)
    private Long startEventId;

    @Parameter(name = ApiConstants.CUSTOM_JOB_ID , type = CommandType.STRING)
    private String injectedJobId;

    public String getInjectedJobId() {
        return this.injectedJobId;
    }

    /**
     * For proper tracking of async commands through the system, events must be generated when the command is
     * scheduled, started, and completed. Commands should specify the type of event so that when the scheduled,
     * started, and completed events are saved to the events table, they have the proper type information.
     *
     * @return a string representing the type of event, e.g. VM.START, VOLUME.CREATE.
     */
    public abstract String getEventType();

    /**
     * For proper tracking of async commands through the system, events must be generated when the command is
     * scheduled, started, and completed. Commands should specify a description for these events so that when
     * the scheduled, started, and completed events are saved to the events table, they have a meaningful description.
     *
     * @return a string representing a description of the event
     */
    public abstract String getEventDescription();

    public void setJob(Object job) {
        this.job = job;
    }

    public Long getStartEventId() {
        return startEventId;
    }

    public void setStartEventId(Long startEventId) {
        this.startEventId = startEventId;
    }

    /**
     * Async commands that want to be tracked as part of the listXXX commands need to
     * provide implementations of the two following methods, getInstanceId() and getInstanceType()
     *
     * getObjectId() should return the id of the object the async command is executing on
     * getObjectType() should return a type from the AsyncJob.Type enumeration
     */
    public Long getInstanceId() {
        return null;
    }

    public ApiCommandJobType getInstanceType() {
        return ApiCommandJobType.None;
    }

    public String getSyncObjType() {
        return null;
    }

    public Long getSyncObjId() {
        return null;
    }

    public Object getJob() {
        return job;
    }

}
