using Server.Gumps;
using Server.Mobiles;

namespace Server.Factions;

public class JoinStone : BaseSystemController
{
    private Faction m_Faction;

    [Constructible]
    public JoinStone(Faction faction = null) : base(0xEDC)
    {
        Movable = false;
        Faction = faction;
    }

    public JoinStone(Serial serial) : base(serial)
    {
    }

    [CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)]
    public Faction Faction
    {
        get => m_Faction;
        set
        {
            m_Faction = value;

            Hue = m_Faction?.Definition.HueJoin ?? 0;
            AssignName(m_Faction?.Definition.SignupName);
        }
    }

    public override string DefaultName => "faction signup stone";

    public override void OnDoubleClick(Mobile from)
    {
        if (m_Faction == null)
        {
            return;
        }

        if (!from.InRange(GetWorldLocation(), 2))
        {
            from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
        }
        else if (FactionGump.Exists(from))
        {
            from.SendLocalizedMessage(1042160); // You already have a faction menu open.
        }
        else if (Faction.Find(from) == null && from is PlayerMobile mobile)
        {
            mobile.SendGump(new JoinStoneGump(mobile, m_Faction));
        }
    }

    public override void Serialize(IGenericWriter writer)
    {
        base.Serialize(writer);

        writer.Write(0); // version

        Faction.WriteReference(writer, m_Faction);
    }

    public override void Deserialize(IGenericReader reader)
    {
        base.Deserialize(reader);

        var version = reader.ReadInt();

        switch (version)
        {
            case 0:
                {
                    Faction = Faction.ReadReference(reader);
                    break;
                }
        }
    }
}