/*
 * Copyright 2016-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.actn.mdsc.pce.impl;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.onosproject.actn.mdsc.pce.TeTunnelPce;
import org.onosproject.actn.mdsc.pce.TeTunnelPceService;
import org.onosproject.tetunnel.api.tunnel.TeTunnel;
import org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

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

/**
 * Implementation of Te Tunnel PCE service.
 */
@Component(immediate = true, service = TeTunnelPceService.class)
public class TeTunnelPceManager implements TeTunnelPceService {

    private static final Logger log = getLogger(TeTunnelPceManager.class);

    private List<TeTunnelPce> pces = Lists.newLinkedList();

    @Activate
    protected void activate() {
        pces.add(0, new DefaultTeTunnelPce());
        log.info("Started");
    }

    @Deactivate
    protected void deactivate() {
        log.info("Stopped");
    }

    @Override
    public Collection<List<TeRouteSubobject>> computePaths(TeTunnel teTunnel) {
        TeTunnelPce pce = null;
        synchronized (pces) {
            for (TeTunnelPce p : pces) {
                if (p.isSuitable(teTunnel)) {
                    pce = p;
                }
            }
        }
        if (pce != null) {
            return pce.computePaths(teTunnel);
        } else {
            return ImmutableList.of();
        }
    }

    @Override
    public Collection<List<TeRouteSubobject>> computePaths(TeTunnel teTunnel,
                                                           TeTunnelPce pce) {
        return pce == null ? null : pce.computePaths(teTunnel);
    }

    @Override
    public void registerPce(TeTunnelPce pce) {
        synchronized (pces) {
            int index = 0;
            while (pces.get(index).getPriority() > pce.getPriority()) {
                index++;
            }

            pces.add(index, pce);
        }
    }
}
