package pta.de.core.controller;

import org.eclipse.jetty.http.HttpStatus;
import pta.de.api.ServiceDistributionCluster;
import pta.de.api.VersionInfo;
import pta.de.core.exceptions.HttpStatusException;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class BackendController {
    public ServiceDistributionCluster readServerDistribution(String cluster) throws HttpStatusException {
        ServiceDistributionCluster[] dcs = ServicesConfigCache.getInstance().getCache();

        for (ServiceDistributionCluster item : dcs) {
            if (item.getClustername().equalsIgnoreCase(cluster) && item.isActive()) {
                return removeInactiveItems(item);
            }
        }
        throw new HttpStatusException(HttpStatus.NOT_FOUND_404);
    }

    public VersionInfo getVersionInfo( String version ) {
        VersionInfo vi = new VersionInfo();
        vi.setBackendVersion( version );
        return vi;
    }

    private ServiceDistributionCluster removeInactiveItems( ServiceDistributionCluster cluster ) {
        List<ServiceDistributionCluster.ServiceDistribution> dlist = Arrays.asList(cluster.getDistributions());
        dlist = dlist.stream().filter(ServiceDistributionCluster.ServiceDistribution::isActive).collect(Collectors.toList());
        ServiceDistributionCluster.ServiceDistribution[] distArr
                = new ServiceDistributionCluster.ServiceDistribution[dlist.size()];
        cluster.setDistributions(dlist.toArray(distArr));
        return cluster;
    }


}
