using CommonAI.Zone;
using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using System;
using CommonAI.Zone.ZoneEditor;
using CommonAI.ZoneClient;
using XmdsCommon.ZoneClient;
using CommonAI.Zone.Formula;
using XmdsCommon.Message;
using XmdsCommon.ZoneClient.XmdsClientVirtual;
using XmdsCommon.EditorData;
using System.IO;
using CommonLang.Concurrent;
using System.Collections.Generic;

namespace XmdsCommon.Plugin
{

    public class XmdsZoneFactory : InstanceZoneFactory
    {
        private XmdsClientFormula mFormula = new XmdsClientFormula();
        public override CommonAI.Zone.Formula.IFormula Formula
        {
            get { return mFormula; }
        }

        public XmdsZoneFactory()
        {
        }
        
        public override IUnitProperties CreateUnitProperties()
        {
            return new XmdsUnitProperties();
        }

        public override IAttackProperties CreateAttackProperties()
        {
            return new XmdsAttackProperties();
        }

        public override IBuffProperties CreateBuffProperties()
        {
            return new XmdsBuffProperties();
        }

        public override IItemProperties CreateItemProperties()
        {
            return new XmdsItemProperties();
        }

        public override ISkillProperties CreateSkillProperties()
        {
            return new XmdsSkillProperties();
        }

        public override ISpellProperties CreateSpellProperties()
        {
            return new XmdsSpellProperties();
        }

        public override IUnitTriggerProperties CreateTriggerProperties()
        {
            return new XmdsUnitTriggerProperties();
        }

        public override ISceneProperties CreateSceneProperties()
        {
            return new XmdsSceneProperties();
        }

        public override ICommonConfig CreateCommonCFG()
        {
            return new XmdsConfig();
        }

        public override IQuestAdapter CreateQuestAdapter(InstanceZone zone)
        {
            throw new NotImplementedException();
        }

        public override ZoneLayer CreateClientZoneLayer(EditorTemplates templates, ILayerClient listener)
        {
            return new HZZoneLayer(templates, listener);
        }

        public override IVirtualClientUnit CreateClientUnitVirtual(ZoneUnit owner)
        {
            //是否主角.
            if (owner is ZoneActor)
            {
                return new XmdsClientVirtual_Actor();
            }



            IUnitVisibleData data = owner.SyncInfo.VisibleInfo;

            //根据数据类型,确定中间层数据类型.
            if (data == null)
            {
                switch (owner.Info.UType)
                {
                    case UnitInfo.UnitType.TYPE_MONSTER:
                        return new XmdsClientVirtual_Monster();
                    case UnitInfo.UnitType.TYPE_NPC:
                        return new XmdsClientVirtual_Monster();
                    case UnitInfo.UnitType.TYPE_PET:
                        return new XmdsClientVirtual_Pet();
                    case UnitInfo.UnitType.TYPE_PLAYER:
                        return new XmdsClientVirtual_Player();
                    case UnitInfo.UnitType.TYPE_SUMMON:
                        return new XmdsClientVirtual_SummonUnit();
                    default:
                        return new XmdsClientVirtual();
                }
            }

            else if (data is SummonUnitVisibleDataB2C)
            {
                return new XmdsClientVirtual_SummonUnit();
            }
            else if (data is PlayerVisibleDataB2C)
            {
                return new XmdsClientVirtual_Player();
            }
            else if (data is PetVisibleDataB2C)
            {
                return new XmdsClientVirtual_Pet();
            }
            else if (data is MonsterVisibleDataB2C)
            {
                return new XmdsClientVirtual_Monster();
            }

            return base.CreateClientUnitVirtual(owner);
        }

        public override string ToClientDisplayName(UnitInfo info, SyncUnitInfo syncInfo)
        {
            if (!string.IsNullOrEmpty(syncInfo.Alias))
            {
                return syncInfo.Alias;
            }
            var prop = info.Properties as XmdsCommon.Plugin.XmdsUnitProperties;
            if (prop.ServerData != null && prop.ServerData.BaseInfo != null)
            {
                return prop.ServerData.BaseInfo.name;
            }
            var visible = syncInfo.VisibleInfo as PlayerVisibleDataB2C;
            if (visible != null && visible.BaseInfo != null)
            {
                return visible.BaseInfo.name;
            }
            return info.Name;
        }
    }

    public class XmdsClientFormula : IFormula
    {
        public override void OnEditorSaving(EditorTemplatesData datas, DirectoryInfo data_root, List<FileInfo> savedfiles, AtomicFloat progress_percent)
        {
            base.OnEditorSaving(datas, data_root, savedfiles, progress_percent);

            SceneSnapManager.SaveAllSceneSnap(datas, new DirectoryInfo(data_root.FullName + "/scene_snaps"));

            //UnitSnapData dataTemp = SceneSnapManager.LoadSceneUnitSnapData(10099);
            SceneSnapManager.SaveAllSceneSnapExt(datas, new DirectoryInfo(data_root.FullName + "/scene_unitsnaps"));
        }

        public override void InitPluginsData(EditorTemplates data_root)
        {
            base.InitPluginsData(data_root);

            SceneSnapManager.InitSceneSnap(data_root.DataRoot + "/scene_snaps", data_root.DataRoot + "/scene_unitsnaps");

        }
    }

}