using System;
using System.Collections;
using Server;
using Knives.Utils;

namespace Knives.Chat3
{
    public class Faction : Channel
    {
        public static void Initialize()
        {
            new Faction();
        }

        public Faction() : base("Faction")
        {
            Commands.Add("faction");
            Commands.Add("f");
            DefaultC = 0x17;

            Register(this);
        }

        public override bool CanChat(Mobile m, bool say)
        {
            if (!General.IsInFaction(m))
            {
                if (say) m.SendMessage(Data.GetData(m).SystemC, General.Local(37));
                return false;
            }

            return base.CanChat(m, say);
        }

        protected override void Broadcast(Mobile m, string msg)
        {
            foreach (Data data in Data.Datas.Values)
            {
                if (data.Channels.Contains(Name) && !data.Ignores.Contains(m))
                {
                    if (data.Mobile.Guild != m.Guild)
                        continue;

                    data.Mobile.SendMessage(m.AccessLevel == AccessLevel.Player ? data.ColorFor(this) : Data.GetData(m).StaffC, String.Format("<{0}{1}> {2}: {3}", NameFor(m), (Style == ChatStyle.Regional && m.Region != null ? "-" + m.Region.Name : ""), m.Name, msg));
                }
                else if (data.Mobile.AccessLevel >= m.AccessLevel && (data.GlobalF || data.GListens.Contains(m)))
                    data.Mobile.SendMessage(data.GlobalFC, String.Format("(Global) <{0}> {1}: {2}", NameFor(m), m.Name, msg));
            }
        }

        public override void GumpOptions(GumpPlus g, int x, int y)
        {
            // Not sure what faction options I will have

            base.GumpOptions(g, x, y);
        }

        public override ArrayList BuildList(Mobile m)
        {
            ArrayList list = base.BuildList(m);

            foreach (Mobile mob in new ArrayList(list))
                if (General.FactionName(mob) != General.FactionName(m))
                    list.Remove(mob);

            return list;
        }
    }
}