using Server;
using System;
using Server.Multis;
using Server.Mobiles;

namespace Server.Items
{
    public class GalleonHold : Container, IGalleonFixture
    {
        public override int LabelNumber { get { return 1149699; } } // cargo hold
        public override bool ForceShowProperties { get { return true; } }

        [CommandProperty(AccessLevel.GameMaster)]
        public BaseGalleon Galleon { get; set; }

        public override int DefaultMaxWeight
        {
            get
            {
                if (Galleon is BritannianShip)
                    return 28000;
                else if (Galleon is GargishGalleon)
                    return 12000;
                else if (Galleon is OrcishGalleon)
                    return 14000;
                else
                    return 16000;
            }
        }

        public override bool IsDecoContainer { get { return false; } }

        public override Rectangle2D Bounds { get { return new Rectangle2D(46, 74, 150, 110); } }
        public override int DefaultGumpID { get { return 0x4C; } }
        public override int DefaultDropSound { get { return 0x42; } }

        public GalleonHold(BaseGalleon galleon, int itemID) : base(itemID)
        {
            Galleon = galleon;
            Movable = false;
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (Galleon == null || from.AccessLevel > AccessLevel.Player)
            {
                base.OnDoubleClick(from);
            }
            else if (!Galleon.Contains(from))
            {
                if (Galleon.TillerMan != null)
                    Galleon.TillerManSay(502490); // You must be on the ship to open the hold.
            }
            else if (Galleon.Owner is PlayerMobile && !Galleon.Scuttled && Galleon.GetSecurityLevel(from) < SecurityLevel.Officer)
            {
                from.Say(1010436); // You do not have permission to do this.
            }
            else
                base.OnDoubleClick(from);
        }

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

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)1);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();

            if (version == 0)
            {
                reader.ReadItem();
            }
        }
    }

    public class HoldItem : Item, IGalleonFixture
    {
        public override int LabelNumber { get { return 1149699; } } // cargo hold
        public override bool ForceShowProperties { get { return true; } }

        [CommandProperty(AccessLevel.GameMaster)]
        public BaseGalleon Galleon { get; set; }

        public HoldItem(BaseGalleon g, int itemid)
            : base(itemid)
        {
            Galleon = g;
            Movable = false;
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (Galleon == null || Galleon.GalleonHold == null || !from.InRange(Location, 2))
                return;

            Galleon.GalleonHold.OnDoubleClick(from);
        }

        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            if (Galleon != null && Galleon.GalleonHold != null)
            {
                var hold = Galleon.GalleonHold;
                list.Add(1072241, String.Format("{0}\t{1}\t{2}\t{3}", hold.TotalItems, hold.MaxItems, hold.TotalWeight, hold.MaxWeight)); // Contents: ~1_COUNT~/~2_MAXCOUNT~ items, ~3_WEIGHT~/~4_MAXWEIGHT~ stones
            }
        }

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

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)1);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();

            if (version == 0)
            {
                reader.ReadInt();
            }
        }
    }
}
