package com.taobao.arthas.core.shell.system;

import java.util.Date;

import com.taobao.arthas.core.shell.future.Future;
import com.taobao.arthas.core.shell.handlers.Handler;
import com.taobao.arthas.core.shell.session.Session;
import com.taobao.arthas.core.shell.term.Tty;

/**
 * A job executed in a {@link JobController}, grouping one or several process.<p/>
 *
 * The job life cycle can be controlled with the {@link #run}, {@link #resume} and {@link #suspend} and {@link #interrupt}
 * methods.
 *
 * @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
 */
public interface Job {

    /**
     * @return the job id
     */
    int id();

    /**
     * @return the job exec status
     */
    ExecStatus status();

    /**
     * @return the execution line of the job, i.e the shell command line that launched this job
     */
    String line();


    /**
     * Run the job, before running the job a {@link Tty} must be set.
     *
     * @return this object
     */
    Job run();

    /**
     * Run the job, before running the job a {@link Tty} must be set.
     *
     * @return this object
     */
    Job run(boolean foreground);

    /**
     * Attempt to interrupt the job.
     *
     * @return true if the job is actually interrupted
     */
    boolean interrupt();

    /**
     * Resume the job to foreground.
     */
    Job resume();

    /**
     * Send the job to background.
     *
     * @return this object
     */
    Job toBackground();

    /**
     * Send the job to foreground.
     *
     * @return this object
     */
    Job toForeground();

    /**
     * Resume the job.
     *
     * @param foreground true when the job is resumed in foreground
     */
    Job resume(boolean foreground);

    /**
     * Resume the job.
     *
     * @return this object
     */
    Job suspend();

    /**
     * Terminate the job.
     */
    void terminate();

    /**
     * @return the first process in the job
     */
    Process process();

    /**
     * @return the date with job timeout
     */
    Date timeoutDate();

    /**
     * Set the date with job timeout
     * @param date the date with job timeout
     */
    void setTimeoutDate(Date date);

    /**
     * @return the session this job belongs to
     */
    Session getSession();
}
