package com.gmail.nossr50.commands.admin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import com.gmail.nossr50.datatypes.McMMOPlayer;
import com.gmail.nossr50.datatypes.PlayerProfile;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.utilities.SkillTools;
import com.gmail.nossr50.skills.utilities.SkillType;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.Users;

public class AddlevelsCommand implements CommandExecutor{
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        PlayerProfile profile;
        int levels;
        SkillType skill;

        switch (args.length) {
        case 2:
            if (sender instanceof Player) {
                if (!SkillTools.isSkill(args[0])) {
                    sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid"));
                    return true;
                }

                if (Misc.isInt(args[1])) {
                    levels = Integer.valueOf(args[1]);
                    skill = SkillTools.getSkillType(args[0]);
                    profile = Users.getPlayer((Player) sender).getProfile();

                    if (skill.equals(SkillType.ALL)) {
                        sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
                    }
                    else {
                        sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", new Object[] {levels, Misc.getCapitalized(skill.toString())}));
                    }

                    profile.addLevels(skill, levels);
                    return true;
                }
            }
            else {
                return false;
            }

        case 3:
            if (!Permissions.hasPermission(sender, "mcmmo.commands.addlevels.others")) {
                sender.sendMessage(command.getPermissionMessage());
                return true;
            }

            if (!SkillTools.isSkill(args[1])) {
                sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid"));
                return true;
            }

            if (!Misc.isInt(args[2])) {
                return false;
            }

            McMMOPlayer mcMMOPlayer = Users.getPlayer(args[0]);
            levels = Integer.valueOf(args[2]);
            skill = SkillTools.getSkillType(args[1]);

            // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process.
            if (mcMMOPlayer == null) {
                profile = new PlayerProfile(args[0], false);

                if (!profile.isLoaded()) {
                    sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
                    return true;
                }

                profile.addLevels(skill, levels);
                profile.save(); // Since this is a temporary profile, we save it here.
            }
            else {
                profile = mcMMOPlayer.getProfile();
                Player player = mcMMOPlayer.getPlayer();

                profile.addLevels(skill, levels);

                // Check if the player is online before we try to send them a message.
                if (player.isOnline()) {
                    if (skill.equals(SkillType.ALL)) {
                        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
                    }
                    else {
                        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", new Object[] {levels, Misc.getCapitalized(skill.toString())}));
                    }
                }
            }

            if (skill.equals(SkillType.ALL)) {
                sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", new Object[] {args[0]}));
            }
            else {
                sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", new Object[] {Misc.getCapitalized(skill.toString()), args[0]}));
            }

            return true;

        default:
            return false;
        }
    }
}

@@ -892,16 +892,18 @@
      if 
+(!
 (sender 
@@ -920,24 +920,25 @@
  Player)
+)
  %7B%0D%0A    
         
@@ -921,32 +921,76 @@
 Player)) %7B%0D%0A    
+            return false;%0D%0A            %7D%0D%0A%0D%0A
             if (
@@ -1018,28 +1018,24 @@
 rgs%5B0%5D)) %7B%0D%0A
-    
             
@@ -1117,36 +1117,32 @@
                 
-   
- 
 return true;%0D%0A  
@@ -1147,37 +1147,29 @@
             
-    
 %7D%0D%0A%0D%0A
-    
             
@@ -1172,16 +1172,17 @@
     if (
+!
 Misc.isI
@@ -1197,32 +1197,72 @@
 1%5D)) %7B%0D%0A        
+        return false;%0D%0A            %7D%0D%0A%0D%0A
             leve
@@ -1301,32 +1301,24 @@
             
-   
-     
 skill = Skil
@@ -1344,32 +1344,24 @@
 (args%5B0%5D);%0D%0A
-        
             
@@ -1428,32 +1428,24 @@
             
-     
-   
 if (skill.eq
@@ -1464,32 +1464,24 @@
 pe.ALL)) %7B%0D%0A
-        
             
@@ -1593,32 +1593,24 @@
             
-      
-  
 %7D%0D%0A         
@@ -1612,32 +1612,24 @@
         
-       
- 
 else %7B%0D%0A
         
@@ -1616,32 +1616,24 @@
     else %7B%0D%0A
-        
             
@@ -1790,37 +1790,21 @@
         
-        %7D%0D%0A%0D%0A        
+%7D%0D%0A%0D%0A
         
@@ -1850,32 +1850,24 @@
             
-        
 return true;
@@ -1871,108 +1871,8 @@
 ue;%0D
-%0A                %7D%0D%0A            %7D%0D%0A            else %7B%0D%0A                return false;%0D%0A            %7D%0D
 %0A%0D%0A 
@@ -3343,75 +3343,77 @@
  // 
-Check if the player is online before we try to send them a message.
+TODO: Is it even possible for the player to be offline at this point?
 %0D%0A  

Change some checks around in /addlevels for readability.