/*
Copyright (C) 2005 David Green <green@couchpotato.net>
All Rights Reserved.

This file is part of Aelfengard.

Aelfengard is proprietary software. You may not redistribute it without
prior written permission from the copyright holder.
*/

package server.command;

import server.AdminFlag;
import server.GameServer;
import server.IdType;
import server.Player;
import server.SyntaxException;
import server.Utils;

public class AdminsCommand extends Command {

    public AdminsCommand() {
        super(CommandCategory.SYSTEM, "Shows a list of administrators that are online, or sends a message to all administrators that are online.");
    }
    
    @Override
    public void run(Player player) throws SyntaxException {
        String msg = CommandProcessor.getRemaining();
        boolean canSeeChat = player.getAdminFlags().contains(AdminFlag.ADMINS_CHAT);
        boolean listAll = "all".equals(msg);
        boolean canListAll = canListAll(player);
        if (listAll && canListAll) {
            StringBuffer sb = new StringBuffer();
            for (Player target : IdType.getAllPlayers()) {
                if (target.getAdminFlags().isEmpty()) {
                    continue; // not an administrator
                }
                StringBuffer psb = new StringBuffer();
                for (AdminFlag flag : target.getAdminFlags()) {
                    if (psb.length() > 0) {
                        psb.append(", ");
                    }
                    psb.append(flag);
                }
                if (sb.length() > 0) {
                    sb.append(", ");
                }
                String nick = target.getName(player, false);
                if (player == target) {
                    nick = Utils.capitalize(nick); // you => You
                }
                sb.append(nick);
                sb.append(" (");
                sb.append(psb);
                sb.append(")");
            }
            player.sendText(true, sb.toString());
            return;
        }
        else if (msg != null && msg.length() > 0) {
            msg = Utils.prettyMessage(msg);
            msg = ":@ZZZ " + msg;
            if (!canSeeChat) {
                msg = " (@30Dsent blind@10F)" + msg;
            }
            int count = GameServer.sendAdminsMessage(player, null, msg);
            if (!canSeeChat) {
                // Player that sent the message hasn't seen anything
                // at this point, so let's give her some feedback.
                if (count == 0) {
                    player.sendText(true, "No administrators @2ZZappear@ZZZ to be " +
                            "online right now. You might want to try sending " +
                            "your message again in a little while.");
                    return;
                }
                else {
                    player.sendText(true, "Thank you, your message has been sent " +
                            "to the administrators. If you don't receive an " +
                            "answer shortly, you might want to try sending " +
                            "your message again.");
                    return;
                }
            }
            return;
        }
        StringBuffer sb = new StringBuffer();
        sb.append("Administrators currently online: ");
        boolean gotOne = false;
        for (Player target : Player.getOnlineAdmins()) {
            if (target.isAFK() && !player.getAdminFlags().contains(AdminFlag.ADMIN_VIEWS)) {
                continue;
            }
            if (gotOne) {
                sb.append(", ");
            }
            String nick = target.getName(player, false);
            if (player == target) {
                nick = Utils.capitalize(nick); // you => You
            }
            sb.append(nick);
            gotOne = true;
        }
        if (gotOne) {
            player.sendText(true, sb.toString());
        }
        else {
            player.sendText(true, "No administrators are currently online.");
        }
    }

    @Override
    public String[] getSyntax(Player player) {
        if (canListAll(player)) {
            return new String[] { "", "ALL", "<message>" };
        }
        else {
            return new String[] { "", "<message>"};
        }
    }
    
    private boolean canListAll(Player player) {
        return player.getAdminFlags().contains(AdminFlag.ADMIN_VIEWS);
    }

}