/*
 * Copyright 2019-present Open Networking Foundation
 *
 * Licensed 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.onosproject.p4runtime.api;

import org.onosproject.net.pi.model.PiActionProfileId;
import org.onosproject.net.pi.model.PiCounterId;
import org.onosproject.net.pi.model.PiMeterId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiEntity;
import org.onosproject.net.pi.runtime.PiHandle;

import java.util.Collection;
import java.util.concurrent.CompletableFuture;

/**
 * P4Runtime client interface for the Read RPC that allows reading multiple
 * entities with one request.
 */
public interface P4RuntimeReadClient {

    /**
     * Returns a new {@link ReadRequest} instance that can bed used to build a
     * batched read request, for the given pipeconf.
     *
     * @param pipeconf pipeconf
     * @return new read request
     */
    ReadRequest read(PiPipeconf pipeconf);

    /**
     * Abstraction of a P4Runtime read request that follows the builder pattern.
     * Multiple entities can be added to the same request before submitting it.
     */
    interface ReadRequest {

        /**
         * Requests to read one entity identified by the given handle.
         *
         * @param handle handle
         * @return this
         */
        ReadRequest handle(PiHandle handle);

        /**
         * Requests to read multiple entities identified by the given handles.
         *
         * @param handles iterable of handles
         * @return this
         */
        ReadRequest handles(Iterable<? extends PiHandle> handles);

        /**
         * Requests to read all table entries from the given table ID.
         *
         * @param tableId table ID
         * @return this
         */
        ReadRequest tableEntries(PiTableId tableId);

        /**
         * Requests to read all table entries from the given table IDs.
         *
         * @param tableIds table IDs
         * @return this
         */
        ReadRequest tableEntries(Iterable<PiTableId> tableIds);

        /**
         * Requests to read the default table entry from the given table.
         *
         * @param tableId table ID
         * @return this
         */
        ReadRequest defaultTableEntry(PiTableId tableId);

        /**
         * Requests to read the default table entry from the given tables.
         *
         * @param tableIds table IDs
         * @return this
         */
        ReadRequest defaultTableEntry(Iterable<PiTableId> tableIds);

        /**
         * Requests to read all action profile groups from the given action
         * profile.
         *
         * @param actionProfileId action profile ID
         * @return this
         */
        ReadRequest actionProfileGroups(PiActionProfileId actionProfileId);

        /**
         * Requests to read all action profile groups from the given action
         * profiles.
         *
         * @param actionProfileIds action profile IDs
         * @return this
         */
        ReadRequest actionProfileGroups(Iterable<PiActionProfileId> actionProfileIds);

        /**
         * Requests to read all action profile members from the given action
         * profile.
         *
         * @param actionProfileId action profile ID
         * @return this
         */
        ReadRequest actionProfileMembers(PiActionProfileId actionProfileId);

        /**
         * Requests to read all action profile members from the given action
         * profiles.
         *
         * @param actionProfileIds action profile IDs
         * @return this
         */
        ReadRequest actionProfileMembers(Iterable<PiActionProfileId> actionProfileIds);

        /**
         * Requests to read all counter cells from the given counter.
         *
         * @param counterId counter ID
         * @return this
         */
        ReadRequest counterCells(PiCounterId counterId);

        /**
         * Requests to read all counter cells from the given counters.
         *
         * @param counterIds counter IDs
         * @return this
         */
        ReadRequest counterCells(Iterable<PiCounterId> counterIds);

        /**
         * Requests to read all direct counter cells from the given table.
         *
         * @param tableId table ID
         * @return this
         */
        ReadRequest directCounterCells(PiTableId tableId);

        /**
         * Requests to read all direct counter cells from the given tables.
         *
         * @param tableIds table IDs
         * @return this
         */
        ReadRequest directCounterCells(Iterable<PiTableId> tableIds);

        /**
         * Requests to read all meter cell configs from the given meter ID.
         *
         * @param meterId meter ID
         * @return this
         */
        ReadRequest meterCells(PiMeterId meterId);

        /**
         * Requests to read all meter cell configs from the given meter IDs.
         *
         * @param meterIds meter IDs
         * @return this
         */
        ReadRequest meterCells(Iterable<PiMeterId> meterIds);

        /**
         * Requests to read all direct meter cell configs from the given table.
         *
         * @param tableId table ID
         * @return this
         */
        ReadRequest directMeterCells(PiTableId tableId);

        /**
         * Requests to read all direct meter cell configs from the given
         * tables.
         *
         * @param tableIds table IDs
         * @return this
         */
        ReadRequest directMeterCells(Iterable<PiTableId> tableIds);

        /**
         * Submits the read request and returns a read response wrapped in a
         * completable future. The future is completed once all entities have
         * been received by the P4Runtime client.
         *
         * @return completable future of a read response
         */
        CompletableFuture<ReadResponse> submit();

        /**
         * Similar to {@link #submit()}, but blocks until the operation is
         * completed, after which, it returns a read response.
         *
         * @return read response
         */
        ReadResponse submitSync();

        //TODO: implement per-entity asynchronous reads. This would allow a user
        // of this client to process read entities as they arrive, instead of
        // waiting for the client to receive them all. Java 9 Reactive Streams
        // seems a good way of doing it.
    }

    /**
     * Response to a P4Runtime read request.
     */
    interface ReadResponse {

        /**
         * Returns true if the request was successful with no errors, otherwise
         * returns false. In case of errors, further details can be obtained
         * with {@link #explanation()} and {@link #throwable()}.
         *
         * @return true if the request was successful with no errors, false
         * otherwise
         */
        boolean isSuccess();

        /**
         * Returns a collection of all PI entities returned by the server.
         *
         * @return collection of all PI entities returned by the server
         */
        Collection<PiEntity> all();

        /**
         * Returns a collection of all PI entities of a given class returned by
         * the server.
         *
         * @param clazz PI entity class
         * @param <E>   PI entity class
         * @return collection of all PI entities returned by the server for the
         * given PI entity class
         */
        <E extends PiEntity> Collection<E> all(Class<E> clazz);

        /**
         * If the read request was not successful, this method returns a message
         * explaining the error occurred. Returns an empty string if such
         * message is not available, or {@code null} if no errors occurred.
         *
         * @return error explanation or empty string or null
         */
        String explanation();

        /**
         * If the read request was not successful, this method returns the
         * internal throwable instance associated with the error (e.g. a {@link
         * io.grpc.StatusRuntimeException} instance). Returns null if such
         * throwable instance is not available or if no errors occurred.
         *
         * @return throwable instance
         */
        Throwable throwable();
    }
}
