package com.massivecraft.factions.cmd;

import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPerm;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.util.Txt;

import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class CmdFactionsPermShow extends FactionsCommand {
    // -------------------------------------------- //
    // CONSTRUCT
    // -------------------------------------------- //

    public CmdFactionsPermShow() {
        // Parameters
        this.addParameter(TypeMPerm.get(), "perm");
        this.addParameter(TypeFaction.get(), "faction", "you");
    }

    // -------------------------------------------- //
    // OVERRIDE
    // -------------------------------------------- //

    @Override
    public void perform() throws MassiveException {
        // Arg: Faction
        MPerm mperm = this.readArg();
        Faction faction = this.readArg(msenderFaction);

        Set<String> permittedIds = faction.getPerms().get(mperm.getId());
        List<MPermable> permables = new MassiveList<>();

        for (String permitted : permittedIds) {
            permables.add(MPerm.idToMPermable(permitted));
        }

        String removeString = Txt.parse(" of ") + faction.getDisplayName(msender);
        List<String> permableList = permables.stream()
                .map(permable -> permable.getDisplayName(msender))
                .map(s -> s.replace(removeString, ""))
                .collect(Collectors.toList());
        String permableNames = Txt.implodeCommaAnd(permableList, Txt.parse("<i>"));

        // Create messages
        msg("<i>In <reset>%s <i>permission <reset>%s <i>is granted to <reset>%s<i>.", faction.describeTo(msender), mperm.getDesc(true, false), permableNames);
    }

    @Deprecated
    public static MPerm.MPermable idToMPermable(String id) {
        return MPerm.idToMPermable(id);
    }

    public static String permablesToDisplayString(Collection<MPermable> permables, Object watcherObject) {
        MPlayer mplayer = MPlayer.get(watcherObject);
        Faction faction = mplayer.getFaction();

        String removeString;
        if (faction.isNone()) {
            removeString = "";
        } else {
            removeString = Txt.parse(" of ") + faction.getDisplayName(mplayer);
        }

        List<String> permableList = permables.stream()
                .map(permable -> permable.getDisplayName(mplayer))
                .map(s -> s.replace(removeString, ""))
                .collect(Collectors.toList());

        return Txt.implodeCommaAnd(permableList, Txt.parse("<i>"));
    }

}