using Server.Commands;
using Server.Commands.Generic;
using Server.Targeting;

namespace Server.Targets
{
    public class MoveTarget : Target
    {
        private readonly object m_Object;

        public MoveTarget(object o) : base(-1, true, TargetFlags.None) => m_Object = o;

        protected override void OnTarget(Mobile from, object o)
        {
            if (o is not IPoint3D ip)
            {
                return;
            }

            if (!BaseCommand.IsAccessible(from, m_Object))
            {
                from.SendLocalizedMessage(500447); // That is not accessible.
                return;
            }

            var p = ip switch
            {
                Item i => i.GetWorldTop(),
                Mobile m  => m.Location,
                _         => new Point3D(ip)
            };

            CommandLogging.WriteLine(
                from,
                $"{from.AccessLevel} {CommandLogging.Format(from)} moving {CommandLogging.Format(m_Object)} to {p}"
            );

            if (m_Object is Item item)
            {
                if (!item.Deleted)
                {
                    item.MoveToWorld(p, from.Map);
                }
            }
            else if (m_Object is Mobile m)
            {
                if (!m.Deleted)
                {
                    m.MoveToWorld(p, from.Map);
                }
            }
        }
    }
}
