using System;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections.Generic;

using Plus.HabboHotel.Rooms;
using Plus.HabboHotel.GameClients;
using Plus.Communication.Packets.Outgoing.Rooms.Chat;

namespace Plus.HabboHotel.Rooms.Chat.Commands.User
{
    class WarpCommand : IChatCommand
    {
        public string PermissionRequired
        {
            get { return "command_warp"; }
        }

        public string Parameters
        {
            get { return "%Pseudo%"; }
        }

        public string Description
        {
            get { return "Attirer quelqu'un"; }
        }

        public void Execute(GameClients.GameClient Session, Rooms.Room Room, string[] Params)
        {
            if (Session.GetHabbo().Rank < 4)
            {
                if (!Room.CheckRights(Session, true))
                {
                    Session.SendWhisper("Ce n'est pas ton appart!");
                    return;
                }
                else
                {
                    if (Params.Length == 1)
                    {
                        Session.SendWhisper("S'il vous plaît entrez le nom de l'utilisateur que vous souhaitez warp.");
                        return;
                    }

                    GameClient TargetClient = PlusEnvironment.GetGame().GetClientManager().GetClientByUsername(Params[1]);
                    if (TargetClient == null)
                    {
                        Session.SendWhisper("Utilisateur introuvable.");
                        return;
                    }

                    RoomUser TargetUser = Room.GetRoomUserManager().GetRoomUserByHabbo(TargetClient.GetHabbo().Id);
                    if (TargetUser == null)
                    {
                        Session.SendWhisper("Utilisateur introuvable.");
                        return;
                    }
                    RoomUser User = Room.GetRoomUserManager().GetRoomUserByHabbo(Session.GetHabbo().Id);
                    if (!Room.GetGameMap().ValidTile(User.X + 2, User.Y + 2) && !Room.GetGameMap().ValidTile(User.X + 1, User.Y + 1))
                    {
                        Session.SendWhisper("Oops,tu ne peut attirer ici!");
                        return;
                    }

                    if (TargetClient.GetHabbo().Username == Session.GetHabbo().Username)
                    {
                        Session.SendWhisper("C'est mignion, mais tu ne peux pas te warp toi-même !");
                        return;
                    }
                    RoomUser ThisUser = Room.GetRoomUserManager().GetRoomUserByHabbo(Session.GetHabbo().Id);
                    if (ThisUser == null)
                        return;

                    if (ThisUser.SetX - 1 == Room.GetGameMap().Model.DoorX)
                    {
                        Session.SendWhisper("Il n'est pas si méchant que ça!");
                        return;
                    }
                    TargetUser.TeleportEnabled = true;
                    Session.SendWhisper("Attire " + TargetClient.GetHabbo().Username + "");
                    TargetClient.SendWhisper("" + Session.GetHabbo().Username + " t'a téléporté vers lui.");


                    if (ThisUser.RotBody % 2 != 0)
                        ThisUser.RotBody--;
                    if (ThisUser.RotBody == 0)
                        TargetUser.MoveTo(ThisUser.X, ThisUser.Y - 1);
                    else if (ThisUser.RotBody == 2)
                        TargetUser.MoveTo(ThisUser.X + 1, ThisUser.Y);
                    else if (ThisUser.RotBody == 4)
                        TargetUser.MoveTo(ThisUser.X, ThisUser.Y + 1);
                    else if (ThisUser.RotBody == 6)
                        TargetUser.MoveTo(ThisUser.X - 1, ThisUser.Y);

                    TargetUser.TeleportEnabled = !TargetUser.TeleportEnabled;
                    Room.GetGameMap().GenerateMaps();
                    TargetUser.TeleportEnabled = false;
                    return;
                }
            } else
            if (Params.Length == 1)
            {
                Session.SendWhisper("S'il vous plaît entrez le nom de l'utilisateur que vous souhaitez warp.");
                return;
            }
            
            GameClient TargetClients = PlusEnvironment.GetGame().GetClientManager().GetClientByUsername(Params[1]);
            if (TargetClients == null)
            {
                Session.SendWhisper("Utilisateur introuvable.");
                return;
            }

            RoomUser TargetUsers = Room.GetRoomUserManager().GetRoomUserByHabbo(TargetClients.GetHabbo().Id);
            if (TargetUsers == null)
            {
                Session.SendWhisper("Utilisateur introuvable.");
                return;
            }
            RoomUser Users = Room.GetRoomUserManager().GetRoomUserByHabbo(Session.GetHabbo().Id);
            if (!Room.GetGameMap().ValidTile(Users.X + 2, Users.Y + 2) && !Room.GetGameMap().ValidTile(Users.X + 1, Users.Y + 1))
            {
                Session.SendWhisper("Oops,tu ne peut attirer ici!");
                return;
            }

            if (TargetClients.GetHabbo().Username == Session.GetHabbo().Username)
            {
                Session.SendWhisper("C'est mignion, mais tu ne peux pas te warp toi-même !");
                return;
            }
            RoomUser ThisUsers = Room.GetRoomUserManager().GetRoomUserByHabbo(Session.GetHabbo().Id);
            if (ThisUsers == null)
                return;

            if (ThisUsers.SetX - 1 == Room.GetGameMap().Model.DoorX)
            {
                Session.SendWhisper("Il n'est pas si méchant que ça!");
                return;
            }
            TargetUsers.TeleportEnabled = true;
            Session.SendWhisper("Attire " + TargetClients.GetHabbo().Username + "");
            TargetClients.SendWhisper("" + Session.GetHabbo().Username + " t'a téléporté vers lui.");


            if (ThisUsers.RotBody % 2 != 0)
                ThisUsers.RotBody--;
            if (ThisUsers.RotBody == 0)
                TargetUsers.MoveTo(ThisUsers.X, ThisUsers.Y - 1);
            else if (ThisUsers.RotBody == 2)
                TargetUsers.MoveTo(ThisUsers.X + 1, ThisUsers.Y);
            else if (ThisUsers.RotBody == 4)
                TargetUsers.MoveTo(ThisUsers.X, ThisUsers.Y + 1);
            else if (ThisUsers.RotBody == 6)
                TargetUsers.MoveTo(ThisUsers.X - 1, ThisUsers.Y);

            TargetUsers.TeleportEnabled = !TargetUsers.TeleportEnabled;
            Room.GetGameMap().GenerateMaps();
            TargetUsers.TeleportEnabled = false;
            return;
        }
    }
}