package com.simon816.chatui.tabs.perm;

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.service.permission.Subject;
import org.spongepowered.api.service.permission.SubjectCollection;
import org.spongepowered.api.service.permission.SubjectReference;
import org.spongepowered.api.util.Tristate;

import java.util.Set;
import java.util.concurrent.CompletableFuture;

public class FallbackPermActions implements PermissionActions {

    @Override
    public SubjectReference addSubjectToCollection(Player player, SubjectCollection collection, String subjIdentifier) {
        return collection.newSubjectReference(subjIdentifier);
    }

    @Override
    public boolean removeSubjectFromCollection(Player player, SubjectCollection collection, Subject subject) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public CompletableFuture<Boolean> setPermission(Player player, Subject subject, Set<Context> contexts, String permission, Tristate value) {
        Boolean perm = subject.getSubjectData().getPermissions(contexts).get(permission);
        if ((perm == null && value == Tristate.UNDEFINED)
                || (perm == Boolean.TRUE && value == Tristate.TRUE)
                || (perm == Boolean.FALSE && value == Tristate.FALSE)) {
            return CompletableFuture.completedFuture(true);
        }
        return subject.getSubjectData().setPermission(contexts, permission, value);
    }

    @Override
    public Tristate getDefault(Subject subject, Set<Context> contexts) {
        return Tristate.UNDEFINED;
    }

    @Override
    public void setDefault(Player player, Subject subject, Set<Context> contexts, Tristate value) {
    }

    @Override
    public void addParent(Player player, Subject subject, Set<Context> contexts, String parentIdentifier) {
        // TODO Auto-generated method stub

    }

    @Override
    public void removeParent(Player player, Subject subject, Set<Context> contexts, SubjectReference parent) {
        subject.getSubjectData().removeParent(contexts, parent);
    }

    @Override
    public CompletableFuture<Boolean> setOption(Player player, Subject subject, Set<Context> contexts, String key, String value) {
        return subject.getSubjectData().setOption(contexts, key, value);
    }
}