package org.ovirt.engine.core.dao;

import java.util.Date;
import java.util.List;

import org.ovirt.engine.core.common.job.JobExecutionStatus;
import org.ovirt.engine.core.common.job.Step;
import org.ovirt.engine.core.compat.Guid;

public interface StepDao extends GenericDao<Step, Guid> {

    /**
     * Check if the {@link Step} with the given id exists or not.
     *
     * @param id
     *            The step's id.
     * @return Does the step exist or not.
     */
    boolean exists(Guid id);

    /**
     * Retrieve all the entities of type {@link Step} for a specific {@code Job}.
     *
     * @return A list of all the job's steps in a flat collection, or an empty list if none is found.
     */
    List<Step> getStepsByJobId(Guid jobId);

    /**
     * Retrieve all the entities of type {@link Step} by a specific step-parent-id.
     *
     * @return A list of all the parent-sub-steps in a flat collection, or an empty list if none is found.
     */
    List<Step> getStepsByParentStepId(Guid parentStepId);

    /**
     * Updates the steps associated with a given job ID, is the current status of the steps differ from the given status
     * or from {@code ExecutionStatus.STARTED}
     *
     * @param jobId
     *            The id of the job which the steps associated with.
     * @param status
     *            The status to update, other than {@code ExecutionStatus.STARTED}
     * @param endTime
     *            The time when the step is ended.
     */
    void updateJobStepsCompleted(Guid jobId, JobExecutionStatus status, Date endTime);

}

