package org.ovirt.engine.api.restapi.resource;

import java.util.List;
import javax.ws.rs.core.Response;

import org.ovirt.engine.api.model.StorageConnection;
import org.ovirt.engine.api.model.StorageConnections;
import org.ovirt.engine.api.resource.StorageDomainServerConnectionResource;
import org.ovirt.engine.api.resource.StorageDomainServerConnectionsResource;
import org.ovirt.engine.core.common.action.AttachDetachStorageConnectionParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;

public class BackendStorageDomainServerConnectionsResource
        extends AbstractBackendCollectionResource<StorageConnection, StorageServerConnections>
        implements StorageDomainServerConnectionsResource {

    Guid storageDomainId = null;

    public BackendStorageDomainServerConnectionsResource(Guid storageDomainId) {
        super(StorageConnection.class, StorageServerConnections.class);
        this.storageDomainId = storageDomainId;
    }

    @Override
    public StorageConnections list() {
        List<StorageServerConnections> connections = getConnections();
        return mapCollection(connections);
    }

    protected List<StorageServerConnections> getConnections() {
        return getEntity(List.class,
                VdcQueryType.GetStorageServerConnectionsForDomain,
                new IdQueryParameters(storageDomainId),
                "storage domain: id=" + storageDomainId);
    }

    private StorageConnections mapCollection(List<StorageServerConnections> entities) {
        StorageConnections collection = new StorageConnections();
        for (StorageServerConnections entity : entities) {
            StorageConnection connection = map(entity);
            if (connection != null) {
                collection.getStorageConnections().add(addLinks(populate(connection, entity)));
            }
        }
        return collection;
    }

    @Override
    public Response add(StorageConnection storageConnection) {
        validateParameters(storageConnection, "id");

        return performAction(VdcActionType.AttachStorageConnectionToStorageDomain,
                new AttachDetachStorageConnectionParameters(storageDomainId, storageConnection.getId()));
    }

    @Override
    public StorageDomainServerConnectionResource getConnectionResource(String id) {
        return inject(new BackendStorageDomainServerConnectionResource(id, this));
    }
}
