/**
 * PermissionsEx
 * Copyright (C) zml and PermissionsEx contributors
 *
 * 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 ninja.leaping.permissionsex.sponge;

import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import ninja.leaping.permissionsex.util.Translatable;
import ninja.leaping.permissionsex.util.command.Commander;
import ninja.leaping.permissionsex.util.command.MessageFormatter;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.pagination.PaginationBuilder;
import org.spongepowered.api.service.pagination.PaginationService;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.format.TextColors;

import javax.annotation.Nullable;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * An abstraction over the Sponge CommandSource that handles PEX-specific message formatting and localization
 */
class SpongeCommander implements Commander<Text.Builder> {
    private final PermissionsExPlugin pex;
    private final CommandSource commandSource;
    private final SpongeMessageFormatter formatter;

    public SpongeCommander(PermissionsExPlugin pex, CommandSource commandSource) {
        this.pex = pex;
        this.commandSource = commandSource;
        this.formatter = new SpongeMessageFormatter(pex);
    }

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

    @Override
    public boolean hasPermission(String permission) {
        return commandSource.hasPermission(permission);
    }

    @Override
    public Locale getLocale() {
        return commandSource instanceof Player ? ((Player) commandSource).getLocale() : Locale.getDefault();
    }

    @Override
    public Optional<Map.Entry<String, String>> getSubjectIdentifier() {
        return Optional.of(Maps.immutableEntry(commandSource.getContainingCollection().getIdentifier(), commandSource.getIdentifier()));
    }

    @Override
    public Set<Map.Entry<String, String>> getActiveContexts() {
        return PEXOptionSubjectData.parSet(commandSource.getActiveContexts());
    }

    @Override
    public MessageFormatter<Text.Builder> fmt() {
        return formatter;
    }

    @Override
    public void msg(Text.Builder text) {
        commandSource.sendMessage(text.color(TextColors.DARK_AQUA).build());
    }

    @Override
    public void debug(Text.Builder text) {
        commandSource.sendMessage(text.color(TextColors.GRAY).build());
    }

    @Override
    public void error(Text.Builder text) {
        commandSource.sendMessage(text.color(TextColors.RED).build());
    }

    @Override
    public void msgPaginated(Translatable title, @Nullable Translatable header, final Iterable<Text.Builder> text) {
        PaginationBuilder build = pex.getGame().getServiceManager().provide(PaginationService.class).get().builder();

        build.title(fmt().hl(fmt().header(fmt().tr(title))).build());
        if (header != null) {
            build.header(fmt().tr(header).color(TextColors.GRAY).build());
        }
        build.contents(Iterables.transform(text, input -> input.color(TextColors.DARK_AQUA).build()))
                .sendTo(commandSource);
    }
}

@@ -990,66 +990,8 @@
 ce;%0A
-import org.spongepowered.api.entity.living.player.Player;%0A
 impo
@@ -2186,85 +2186,18 @@
 urce
- instanceof Player ? ((Player) commandSource).getLocale() : Locale.getDefault
+.getLocale
 ();%0A

Use proper locales for non-Player CommandSources