/*
 * This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT).
 *
 * Copyright (c) JCThePants (www.jcwhatever.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.jcwhatever.nucleus.internal.commands.friends;

import com.jcwhatever.nucleus.Nucleus;
import com.jcwhatever.nucleus.internal.NucLang;
import com.jcwhatever.nucleus.managed.commands.CommandInfo;
import com.jcwhatever.nucleus.managed.commands.arguments.ICommandArguments;
import com.jcwhatever.nucleus.managed.commands.exceptions.CommandException;
import com.jcwhatever.nucleus.managed.commands.mixins.IExecutableCommand;
import com.jcwhatever.nucleus.managed.commands.utils.AbstractCommand;
import com.jcwhatever.nucleus.managed.language.Localizable;
import com.jcwhatever.nucleus.providers.friends.Friends;
import com.jcwhatever.nucleus.providers.friends.IFriend;
import com.jcwhatever.nucleus.providers.friends.IFriendLevel;
import com.jcwhatever.nucleus.utils.player.PlayerUtils;

import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionDefault;

import java.util.UUID;

@CommandInfo(
        command="add",
        staticParams = { "friendName", "level=casual" },
        description="Add a friend to your friends list.",
        paramDescriptions = {
                "friendName= The name of player to add as a friend.",
                "level= Optional. The level of friendship. Possible values " +
                        "are 'casual', 'good', or 'best'. Default is 'casual'. A number value can also be used."
        },
        permissionDefault = PermissionDefault.TRUE)

class AddSubCommand extends AbstractCommand implements IExecutableCommand {

    @Localizable static final String _LEVEL_NOT_FOUND = "A friend level named '{0}' was not found.";
    @Localizable static final String _PLAYER_NOT_FOUND = "A player named '{0: friend name}' was not found.";
    @Localizable static final String _ALREADY_FRIEND = "Player '{0}' is already in your friends list.";
    @Localizable static final String _SUCCESS =  "Player '{0}' added to your friends list.";

    @Override
    public void execute(CommandSender sender, ICommandArguments args) throws CommandException {

        CommandException.checkNotConsole(getPlugin(), this, sender);

        String name = null;
        int rawLevel;

        if (args.hasInteger("level")) {
            rawLevel = args.getInteger("level");
        }
        else {
            
            String levelName = args.getString("level");

            IFriendLevel level = Nucleus.getProviders().getFriends().getLevel(levelName);
            if (level == null)
                throw new CommandException(NucLang.get(_LEVEL_NOT_FOUND, levelName));

            name = level.getName();
            rawLevel = level.getRawLevel();
        }

        UUID friendId = PlayerUtils.getPlayerId(name);
        if (friendId == null)
            throw new CommandException(NucLang.get(_PLAYER_NOT_FOUND, name));

        Player player = (Player)sender;

        IFriend friend = Friends.get(player, friendId);
        if (friend != null) {
            tell(sender, NucLang.get(_ALREADY_FRIEND, friend.getName()));
            return; // finish
        }

        Friends.add(player, friendId, rawLevel);

        tellSuccess(sender, NucLang.get(_SUCCESS, name));
    }
}


@@ -2310,16 +2310,43 @@
 nds list
+ or change friendship level
 .%22,%0A    
@@ -3026,24 +3026,22 @@
 ng _
-ALREADY_FRIEN
+SUCCESS_AD
 D =
+ 
  %22Pl
@@ -3055,21 +3055,16 @@
 0%7D' 
-is already in
+added to
  you
@@ -3126,16 +3126,20 @@
 _SUCCESS
+_SET
  =  %22Pla
@@ -3152,34 +3152,32 @@
 0%7D' 
-added to your friends list
+friendship level changed
 .%22;%0A
@@ -3380,20 +3380,44 @@
  name = 
-null
+args.getString(%22friendName%22)
 ;%0A      
@@ -3829,44 +3829,8 @@
 );%0A%0A
-            name = level.getName();%0A
     
@@ -4187,66 +4187,100 @@
     
-tell(sender, NucLang.get(_ALREADY_FRIEND, friend.getN
+friend.setRawLevel(rawLevel);%0A            tellSuccess(sender, NucLang.get(_SUCCESS_SET, n
 ame
-()
 ));%0A
@@ -4291,41 +4291,29 @@
     
+%7D%0A
     
-return; // finish%0A        %7D%0A%0A
+    else %7B%0A    
     
@@ -4357,17 +4357,20 @@
 Level);%0A
-%0A
+    
         
@@ -4409,16 +4409,20 @@
 _SUCCESS
+_ADD
 , name))
@@ -4419,21 +4419,31 @@
 DD, name));%0A
+        %7D%0A
     %7D%0A%7D%0A%0A

allow changing friend level via add command