/*
 * Copyright 2018-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.drivers.p4runtime;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.onosproject.net.DeviceId;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.net.group.Group;
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupOperation;
import org.onosproject.net.group.GroupOperations;
import org.onosproject.net.group.GroupProgrammable;
import org.slf4j.Logger;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import static com.google.common.base.Preconditions.checkArgument;
import static org.slf4j.LoggerFactory.getLogger;

/**
 * Implementation of GroupProgrammable for P4Runtime devices that uses two
 * different implementation of the same behavior to handle both action profile
 * groups and multicast groups.
 */
public class P4RuntimeGroupProgrammable
        extends AbstractHandlerBehaviour implements GroupProgrammable {

    private final Logger log = getLogger(this.getClass());

    private void doPerformGroupOperation(DeviceId deviceId, GroupOperations groupOps) {
        // TODO: fix GroupProgrammable API, passing the device ID is ambiguous
        checkArgument(deviceId.equals(data().deviceId()),
                      "passed deviceId must be the same assigned to this behavior");
        final List<GroupOperation> actionGroups = Lists.newArrayList();
        final List<GroupOperation> multicastGroups = Lists.newArrayList();
        groupOps.operations().forEach(op -> {
            if (op.groupType().equals(GroupDescription.Type.ALL)) {
                multicastGroups.add(op);
            } else {
                actionGroups.add(op);
            }
        });
        if (!actionGroups.isEmpty()) {
            actionProgrammable().performGroupOperation(
                    deviceId, new GroupOperations(actionGroups));
        }
        if (!multicastGroups.isEmpty()) {
            multicastProgrammable().performGroupOperation(
                    deviceId, new GroupOperations(multicastGroups));
        }
    }

    private Collection<Group> doGetGroups() {
        return new ImmutableList.Builder<Group>()
                .addAll(actionProgrammable().getGroups())
                .addAll(multicastProgrammable().getGroups())
                .build();
    }

    private P4RuntimeActionGroupProgrammable actionProgrammable() {
        P4RuntimeActionGroupProgrammable prog = new P4RuntimeActionGroupProgrammable();
        prog.setData(data());
        prog.setHandler(handler());
        return prog;
    }

    private P4RuntimeMulticastGroupProgrammable multicastProgrammable() {
        P4RuntimeMulticastGroupProgrammable prog = new P4RuntimeMulticastGroupProgrammable();
        prog.setData(data());
        prog.setHandler(handler());
        return prog;
    }

    @Override
    public void performGroupOperation(DeviceId deviceId, GroupOperations groupOps) {
        try {
            doPerformGroupOperation(deviceId, groupOps);
        } catch (Throwable ex) {
            log.error("Unhandled exception on performGroupOperation", ex);
        }
    }

    @Override
    public Collection<Group> getGroups() {
        try {
            return doGetGroups();
        } catch (Throwable ex) {
            log.error("Unhandled exception on getGroups", ex);
            return Collections.emptyList();
        }
    }
}
