package com.qcloud.cos.event;

/**
 * An enumeration that denotes various types of progress event.
 */
public enum ProgressEventType {
    //////////////////////////////////////////////////////////////////////////
    // Request Cycle Event:
    // related to the execution of a single http request-response to COS
    //////////////////////////////////////////////////////////////////////////
    /**
     * A general byte transfer event that happens during sending a request or
     * reading a response.
     */
    @Deprecated
    BYTE_TRANSFER_EVENT,
    /**
     * Event of the content length to be sent in a request.
     */
    REQUEST_CONTENT_LENGTH_EVENT,
    /**
     * Event of the content length received in a response.
     */
    RESPONSE_CONTENT_LENGTH_EVENT,

    /**
     * Used to indicate the number of bytes to be sent to COS.
     */
    REQUEST_BYTE_TRANSFER_EVENT,
    /**
     * Used to indicate the number of bytes received from COS.
     */
    RESPONSE_BYTE_TRANSFER_EVENT,
    /**
     * Used to indicate the number of bytes discarded after being received from COS.
     */
    RESPONSE_BYTE_DISCARD_EVENT,

    /* Generic request progress events */

    /**
     * Event indicating that the client has started sending the COS API request.
     * This type of event is guaranteed to be only fired once during a
     * request-response cycle, even when the request is retried.
     */
    CLIENT_REQUEST_STARTED_EVENT,

    /**
     * Event indicating that the client has started sending the HTTP request.
     * The request progress listener will be notified of multiple instances of
     * this type of event if the request gets retried.
     */
    HTTP_REQUEST_STARTED_EVENT,

    /**
     * Event indicating that the client has finished sending the HTTP request.
     * The request progress listener will be notified of multiple instances of
     * this type of event if the request gets retried.
     */
    HTTP_REQUEST_COMPLETED_EVENT,

    /**
     * Event indicating that the HTTP request content is reset, which may or may not
     * be caused by the retry of the request.
     */
    HTTP_REQUEST_CONTENT_RESET_EVENT,

    /**
     * Event indicating that a failed request is detected as retryable and is
     * ready for the next retry.
     */
    CLIENT_REQUEST_RETRY_EVENT,

    /**
     * Event indicating that the client has started reading the HTTP response.
     * The request progress listener will be notified of this event only if the
     * client receives a successful service response (i.e. 2XX status code).
     */
    HTTP_RESPONSE_STARTED_EVENT,

    /**
     * Event indicating that the client has finished reading the HTTP response.
     * The request progress listener will be notified of this event only if the
     * client receives a successful service response (i.e. 2XX status code).
     */
    HTTP_RESPONSE_COMPLETED_EVENT,

    /**
     * Event indicating that the HTTP response content is reset.
     */
    HTTP_RESPONSE_CONTENT_RESET_EVENT,

    /**
     * Event indicating that the client has received a successful service
     * response and has finished parsing the response data.
     */
    CLIENT_REQUEST_SUCCESS_EVENT,

    /**
     * Event indicating that a client request has failed (after retries have
     * been conducted).
     */
    CLIENT_REQUEST_FAILED_EVENT,

    //////////////////////////////////////////////////////////////////////////
    // Transfer Event:
    // Progress events that are used by COS client */
    //////////////////////////////////////////////////////////////////////////
    TRANSFER_PREPARING_EVENT,
    TRANSFER_STARTED_EVENT,
    TRANSFER_COMPLETED_EVENT,
    TRANSFER_FAILED_EVENT,
    TRANSFER_CANCELED_EVENT,
    TRANSFER_PART_STARTED_EVENT,
    TRANSFER_PART_COMPLETED_EVENT,
    TRANSFER_PART_FAILED_EVENT;

    /**
     * Returns true if this event type is a transfer event, which may involve
     * multiple request cycle events.
     * 
     * @see #isRequestCycleEvent()
     */
    public boolean isTransferEvent() {
        switch (this) {
            case TRANSFER_CANCELED_EVENT:
            case TRANSFER_COMPLETED_EVENT:
            case TRANSFER_FAILED_EVENT:
            case TRANSFER_PART_COMPLETED_EVENT:
            case TRANSFER_PART_FAILED_EVENT:
            case TRANSFER_PART_STARTED_EVENT:
            case TRANSFER_PREPARING_EVENT:
            case TRANSFER_STARTED_EVENT:
                return true;
            default:
                return false;
        }
    }

    /**
     * Returns true if this event type is related to the execution of a 
     * single http request-response to COS; false otherwise.
     */
    public boolean isRequestCycleEvent() {
        return !isTransferEvent();
    }

    /**
     * Returns true if this even type is associated with some number of bytes;
     * false otherwise.
     */
    public boolean isByteCountEvent() {
        switch (this) {
            case BYTE_TRANSFER_EVENT:
            case HTTP_REQUEST_CONTENT_RESET_EVENT:
            case HTTP_RESPONSE_CONTENT_RESET_EVENT:

            case REQUEST_BYTE_TRANSFER_EVENT:
            case RESPONSE_BYTE_TRANSFER_EVENT:

            case RESPONSE_BYTE_DISCARD_EVENT:

            case REQUEST_CONTENT_LENGTH_EVENT:
            case RESPONSE_CONTENT_LENGTH_EVENT:
                return true;
            default:
                return false;
        }
    }
}