package org.keycloak.authorization.mongo.adapter;

import org.keycloak.authorization.AuthorizationProvider;
import org.keycloak.authorization.model.Resource;
import org.keycloak.authorization.model.ResourceServer;
import org.keycloak.authorization.model.Scope;
import org.keycloak.authorization.mongo.entities.ResourceEntity;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.mongo.keycloak.adapters.AbstractMongoAdapter;

import java.util.List;
import java.util.Set;

import static java.util.stream.Collectors.toList;

/**
 * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
 */
public class ResourceAdapter extends AbstractMongoAdapter<ResourceEntity> implements Resource {

    private final ResourceEntity entity;
    private final AuthorizationProvider authorizationProvider;

    public ResourceAdapter(ResourceEntity entity, MongoStoreInvocationContext invocationContext, AuthorizationProvider authorizationProvider) {
        super(invocationContext);
        this.entity = entity;
        this.authorizationProvider = authorizationProvider;
    }

    @Override
    public String getId() {
        return getMongoEntity().getId();
    }

    @Override
    public String getName() {
        return getMongoEntity().getName();
    }

    @Override
    public void setName(String name) {
        getMongoEntity().setName(name);
        updateMongoEntity();
    }

    @Override
    public String getUri() {
        return getMongoEntity().getUri();
    }

    @Override
    public void setUri(String uri) {
        getMongoEntity().setUri(uri);
        updateMongoEntity();
    }

    @Override
    public String getType() {
        return getMongoEntity().getType();
    }

    @Override
    public void setType(String type) {
        getMongoEntity().setType(type);
        updateMongoEntity();
    }

    @Override
    public List<Scope> getScopes() {
        return getMongoEntity().getScopes().stream()
                .map(id -> authorizationProvider.getStoreFactory().getScopeStore().findById(id, getResourceServer().getId()))
                .collect(toList());
    }

    @Override
    public String getIconUri() {
        return getMongoEntity().getIconUri();
    }

    @Override
    public void setIconUri(String iconUri) {
        getMongoEntity().setIconUri(iconUri);
        updateMongoEntity();
    }

    @Override
    public ResourceServer getResourceServer() {
        return this.authorizationProvider.getStoreFactory().getResourceServerStore().findById(getMongoEntity().getResourceServerId());
    }

    @Override
    public String getOwner() {
        return getMongoEntity().getOwner();
    }

    @Override
    public void updateScopes(Set<Scope> scopes) {
        getMongoEntity().updateScopes(scopes);
        updateMongoEntity();
    }

    @Override
    protected ResourceEntity getMongoEntity() {
        return this.entity;
    }
}
