/*
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 java.util.Map;

import server.Player;
import server.Skill;
import server.SyntaxException;

public class AdminSkillCommand extends Command {

    public AdminSkillCommand() {
        super(CommandCategory.ADMIN, "Administers the skill system.");
    }

    @Override
    public void run(Player player) throws SyntaxException {
        String subcmd = CommandProcessor.nextToken();
        if (subcmd == null) {
            throw new SyntaxException();
        }
        else if ("list".equals(subcmd)) {
            if (CommandProcessor.nextToken() != null) {
                throw new SyntaxException();
            }
            player.sendText(true, "The following skills are available:");
            printSkills(player, Skill.getRoot(), 0, "");
        }
        else if ("add".equals(subcmd)) {
            String name = CommandProcessor.nextToken();
            if (name == null || CommandProcessor.nextToken() != null) {
                throw new SyntaxException();
            }
            if (Skill.getRoot().createSkill(name)) {
                player.sendText(true, "Skill added.");
            }
            else {
                player.sendText(true, "That skill already exists.");
            }
            for (Player p : Player.getOnlinePlayers()) {
                p.validateSkills();
            }
        }
        else if ("delete".equals(subcmd)) {
            String name = CommandProcessor.nextToken();
            if (name == null || CommandProcessor.nextToken() != null) {
                throw new SyntaxException();
            }
            Skill subskill = Skill.getRoot().getSkill(name);
            if (subskill == null) {
                player.sendText(true, "That skill doesn't exist.");
            }
            else if (!subskill.isLeaf()) {
                player.sendText(true, "Only leaf skills can be deleted.");
            }
            else {
                Skill.getRoot().deleteSkill(name);
                player.sendText(true, "Skill deleted.");
            }
            for (Player p : Player.getOnlinePlayers()) {
                p.validateSkills();
            }
        }
        else {
            throw new SyntaxException();
        }
    }
    
    private static void printSkills(Player player, Skill skill, int indentLevel, String prefix) {
        for (Map.Entry<String,Skill> entry : skill.getSubSkills().entrySet()) {
            String newPrefix = prefix;
            if (prefix.length() > 0) {
                newPrefix += '.';
            }
            newPrefix += entry.getKey();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < indentLevel; i++) {
                sb.append("| ");
            }
            sb.append(entry.getKey());
            if (entry.getValue().isLeaf()) {
                for (int i = sb.length(); i < 20; i++) {
                    sb.append('.');
                }
                sb.append(' ');
                sb.append(player.getSkillLevel(newPrefix));
            }
            player.sendText(false, sb.toString());
            SkillCommand.printSkills(player, entry.getValue(), indentLevel + 1, newPrefix);
        }
    }

    @Override
    public String[] getSyntax(Player player) {
        return new String[] {
                "LIST",
                "ADD <skill>",
                "DELETE <skill>",
        };
    }

}