using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AX.MessageSystem;
using System;
using AX.InputSystem;
using UnityEngine.UI;

[RequireComponent(typeof(BaseGameObjInfo))]
public class ObjSelectCtrl : MonoBehaviour
{
    public bool selected;//是否被选中
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnEnable()
    {
        MessageDispatcher.AddListener("police_call", EscCancelSelected);
        MessageDispatcher.AddListener("RADIO_SELECTED_COMMAND", RadioSelect);//单选选中处理

        MessageDispatcher.AddListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);//ESC取消选中处理

        //接收DrawRectSelectRange中框选画框处理时,处理框选是否选中逻辑发出的消息:处理框选操作之前选中对象的取消选中
        MessageDispatcher.AddListener("CANCEL_OBJ_SELECTED", CancelObjSelected);
        //接收DrawRectSelectRange中框选画框处理时,处理框选是否选中逻辑发出的消息:处理框选操作选中对象
        MessageDispatcher.AddListener("OBJ_RECT_SELECTED", ObjRectSelected);
        MessageDispatcher.AddListener("CloneCharacterSelected", EscCancelSelected);
    }

    void OnDisable()
    {
        MessageDispatcher.RemoveListener("police_call", EscCancelSelected);
        MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect);

        MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);

        MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected);
        MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected);
        MessageDispatcher.RemoveListener("CloneCharacterSelected", EscCancelSelected);
    }

    void OnDestroy()
    {
        MessageDispatcher.RemoveListener("police_call", EscCancelSelected);
        MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect);

        MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);

        MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected);
        MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected);
        MessageDispatcher.RemoveListener("CloneCharacterSelected", EscCancelSelected);
    }

    private void RadioSelect(IMessage obj)
    {
        var gameObjID = (long)obj.Sender;
        var hitObj = EntitiesManager.Instance.GetEntityByID(gameObjID);

        if (hitObj == gameObject)
        {
            if (gameObject.GetComponent<BaseGameObjInfo>().gameObjType != CloneObjType.SafeArea)
            {
                if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
                {
                    if (GameSettings.othersSettings.isSelectedDisaster) 
                    {
                        //if (gameObject.transform.parent.parent.name== "P_Disasters") 
                        //{//演习模式下不能选中灾情
                        //    return;
                        //}
                    }
                    if (gameObject.GetComponent<BaseGameObjInfo>().UserID == CurrentUserInfo.mySelf.Id)
                    {
                        //if (CurrentUserInfo.mySelf.Id == CurrentUserInfo.room.Owner.UserInfo.Id 
                        //    && GameSettings.othersSettings.isStartDrill)
                        //{
                        //    return;
                        //}

                    }
                    else
                    {
                        if (gameObject.transform.parent.parent.name == "P_Disasters")
                        {
                            if (CurrentUserInfo.mySelf.Id == CurrentUserInfo.room.Owner.UserInfo.Id)
                            {
                               
                            }
                            else 
                            {
                                return;
                            }
                        }
                        else 
                        {
                            return;
                        }
                    }
                }
                   
                if (GameSettings.othersSettings.mode == Mode.DisasterManagement)
                {
                    if (!GameSettings.disasterSetting.isCteateDisaster)
                    {//灾情库编辑,查看下
                        if (!GameSettings.disasterSetting.isEdit)
                        {//灾情库查看下,不能选中
                            return;
                        }
                    }
                }
                //如果点选是伤员且演练已经开始,如果伤员已经被操作(引导或者急救),则不能操作
                if (GameSettings.othersSettings.isStartDrill)
                {
                    if (gameObject.GetComponent<TrappedMoveFree>())
                    {
                        TrappedMoveFree trapped = gameObject.GetComponent<TrappedMoveFree>();
                        if (trapped.isBefirstAirOrMoving || trapped.Guidance || trapped.OverMoveOrGuidance)
                        {
                            LoadPromptWin.Instance.LoadTextPromptWindow("不能操作当前被困人员", 1f);
                            return;
                        }
                    }
                    if (gameObject.GetComponent<WoundedSave>())
                    {
                        WoundedSave wound = gameObject.GetComponent<WoundedSave>();
                        if (wound.isBefirstAirOrMoving || wound.OverMoveOrGuidance) 
                        {
                            LoadPromptWin.Instance.LoadTextPromptWindow("不能操作当前伤员", 1f);
                            return;
                        }
                    }
                }

                clearSelection();

                if (hitObj.tag != "Player")
                {//除消防员外其他可选中物体的单选
                    SelectedObjs.selectedObj = hitObj;
                }
                else
                {//消防员单选
                    if (!SelectedObjs.selectedCharacters.Contains(hitObj))
                        SelectedObjs.selectedCharacters.Add(hitObj);
                }

                DoSelect(gameObject);

                //TODO: 如果选中物体拥有属性面板那么打开所选物体的属性设置按钮
                AttributeSetting.Instance.OpenSettingsPanel(hitObj);

                //如果是中队或者战斗班,选中的是消防员或者车辆或移动水泡
                if (SkillTollPanel.Instance)
                {
                    SkillTollPanel.Instance.SetShowSkillPanel(hitObj);
                }
            }
            else
            {   //安全区特殊处理
                if (CurrentUserInfo.generalCommanding)
                {
                    clearSelection();
                    SelectedObjs.selectedObj = hitObj;
                    DoSelect(gameObject);
                }
            }
            Bags bagData = hitObj.GetComponent<Bags>();

            if (bagData!=null)
            {
                // 设置当前背包为选中对象背包,可以为null
                EquipManager.Instance.CurrentSelectedBag = hitObj.GetComponent<Bags>();
            }
            else
            {
                if (GameObject.Find("UIViewBag")) 
                {
                    // 没有背包的对象关闭背包
                    UIManager.HideView<UIViewBag>();

                }
                if (GameObject.Find("UIViewEquipLib")) 
                {
                    // 关闭仓库界面
                    UIManager.HideView<UIViewEquipLib>();
                }
            }
        }
    }

    private void EscCancelSelected(IMessage obj)
    {
        if (InputManager.IsGuidance)
        {
            LoadPromptWin.Instance.LoadTextPromptWindow("请先完成当前引导", 1f);
            return;
        }
        if (InputManager.isTagSearchRoom)
        {
            InputManager.skill = false;
            InputManager.isTagSearchRoom = false;
            TagSearchRoomSkillPanel.Instance.Hide();
            InputManager.tagSearchRoomPoint = Vector3.zero;
        }
        
        {
            if (SelectedObjs.selectedObj != null )
            {
                CloneGameObjInfo info = SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>();
                FloorsPanelManager data = GameObject.Find("Canvas").transform.GetComponentInChildren<FloorsPanelManager>(false);
                if (info && data)
                {
                    if (info.buildNum == data.CurrentFloor.buildNum)
                    {
                        if (info.floorNum > data.CurrentFloor.floorNum ||
                            (info.floorNum == data.CurrentFloor.floorNum && info.interlayerNum > data.CurrentFloor.interlayerNum))
                        {
                            Renderer[] renderers = SelectedObjs.selectedObj.GetComponentsInChildren<Renderer>();
                            for (int i = 0; i < renderers.Length; i++)
                            {
                                renderers[i].enabled = false;
                            }
                            if (SelectedObjs.selectedObj.GetComponent<CreatHaemalUI>()) //如果是被困人员/伤员,绑定了UI
                            {
                                Transform ui = SelectedObjs.selectedObj.GetComponent<CreatHaemalUI>().haemal.transform;
                                Image[] images = ui.GetComponentsInChildren<Image>(true);
                                for (int j = 0; j < images.Length; j++)
                                {
                                    images[j].enabled = false;
                                }
                                Text[] texts = ui.GetComponentsInChildren<Text>(true);
                                for (int j = 0; j < texts.Length; j++)
                                {
                                    texts[j].enabled = false;
                                }
                            }
                            if (SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.fireman ||
             SelectedObjs.selectedObj.GetComponent<TruckMessage>()||
             
              SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.Trailer ||
              SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.OilSupplyTruck ||
              SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LiquipSupplyTruck ||
              SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.RescueCarrierCar ||
              SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LifeGuaranteeCar)
                            {
                                UINameItem[] names = GameObject.Find("Canvas").transform.Find("TheHeadName").GetComponentsInChildren<UINameItem>(true);
                                for (int j = 0; j < names.Length; j++)
                                {
                                    if (names[j].Target == SelectedObjs.selectedObj.gameObject)
                                    {
                                        names[j].gameObject.SetActive(false);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (SelectedObjs.selectedCharacters.Count > 0 )
            {
                FloorsPanelManager data = GameObject.Find("Canvas").transform.GetComponentInChildren<FloorsPanelManager>(false);
                UINameItem[] names = GameObject.Find("Canvas").transform.Find("TheHeadName").GetComponentsInChildren<UINameItem>(true);
                for (int i = 0; i < SelectedObjs.selectedCharacters.Count; i++)
                {
                    CloneGameObjInfo info = SelectedObjs.selectedCharacters[i].GetComponent<CloneGameObjInfo>();

                    if (info && data)
                    {
                        if (info.buildNum == data.CurrentFloor.buildNum)
                        {
                            if (info.floorNum > data.CurrentFloor.floorNum ||
                                (info.floorNum == data.CurrentFloor.floorNum && info.interlayerNum > data.CurrentFloor.interlayerNum))
                            {
                                Renderer[] renderers = SelectedObjs.selectedCharacters[i].GetComponentsInChildren<Renderer>();
                                for (int j = 0; j < renderers.Length; j++)
                                {
                                    renderers[j].enabled = false;
                                }
                                for (int j = 0; j < names.Length; j++)
                                {
                                    if (names[j].Target == SelectedObjs.selectedCharacters[i])
                                    {
                                        names[j].gameObject.SetActive(false);
                                    }
                                }
                            }
                        }
                    }
                }

            }
        }
        clearSelection();
        if (SkillTollPanel.Instance)
        {
            SkillTollPanel.Instance.SetSkillPanelHide();
        }

        if (GameObject.Find("Main Camera").GetComponent<CameraManager>().viewType == CameraViewState.ThirdPersonView)
        {//处理总,支,大第三人称情况下,取消安全区等对象的选中时,恢复角色的选中以便其能寻路
            if (SelectedObjs.selectedRolePlay == null)
            {
                SelectedObjs.selectedRolePlay = GameObject.Find("Character");
            }
        }
       

    }


    private void CancelObjSelected(IMessage obj)
    {
        //如果框选之前有不能框选的物体被单选选中,框选时,需要取消它的选中
        if (SelectedObjs.selectedObj)
        {
            DoDisSelect(SelectedObjs.selectedObj);
            SelectedObjs.selectedObj = null;
        }

        var gameObj = (GameObject)obj.Sender;
        //如果框选之前有能被框选的物体选中了,且这些物体不在这次框选范围内,取消其的选中
        if (SelectedObjs.selectedCharacters.Contains(gameObj))
        {
            DoDisSelect(gameObj);
            SelectedObjs.selectedCharacters.Remove(gameObj);
        }
        if (SkillTollPanel.Instance)
        {
            SkillTollPanel.Instance.SetSkillPanelHide();
        }
    }

    private void ObjRectSelected(IMessage obj)
    {
        var gameObj = (GameObject)obj.Sender;

        //框选范围内的物体,如果没有选中,进行选中处理,如果已经被选中,则不做处理,保持原来选中状态
        if (!SelectedObjs.selectedCharacters.Contains(gameObj))
        {
            SelectedObjs.selectedCharacters.Add(gameObj);
            DoSelect(gameObj);
        }
        if (SkillTollPanel.Instance)
        {
            SkillTollPanel.Instance.SetSkillPanelHide();
        }
    }

    private void DoSelect(GameObject obj)
    {
        obj.GetComponent<ObjSelectCtrl>().selected = true;
        //SetLayerRecursively(obj, 28);
        var layer = LayerMask.NameToLayer("HighLighted");
        SetLayerRecursively(obj, layer);
        //选中物体头顶名称变色处理
        // MessageDispatcher.SendMessage("CHANGE_HEAD_NAME_COLOUR", (object)obj.name);

        //TODO: 管线米数显示处理
    }

    private void DoDisSelect(GameObject obj)
    {
        obj.GetComponent<ObjSelectCtrl>().selected = false;
        //取消选中后设置为原来的层
        CloneGameObjInfo info = obj.GetComponent<CloneGameObjInfo>();
        SetLayerRecursively(obj, info.Layer);
        //取消选中物体头顶名称变色处理
        // MessageDispatcher.SendMessage("CHANGE_HEAD_NAME_COLOUR_CLEAR", (object)obj.name);
    }

    private void clearSelection()
    {
        if (SelectedObjs.selectedObj)
        {
            DoDisSelect(SelectedObjs.selectedObj);
            SelectedObjs.selectedObj = null;
        }
        if (SelectedObjs.selectedCharacters.Count>0)
        {
            for (int i = SelectedObjs.selectedCharacters.Count - 1; i >= 0; i--)
            {
                DoDisSelect(SelectedObjs.selectedCharacters[i]);
                SelectedObjs.selectedCharacters.Remove(SelectedObjs.selectedCharacters[i]);
            }
        }
       
    }

    private void SetLayerRecursively(GameObject obj, int newLayer)
    {
        if (!obj.GetComponent<SelectedHighLightRemoved>())
        {
            obj.layer = newLayer;
            foreach (Transform child in obj.transform)
            {
                SetLayerRecursively(child.gameObject, newLayer);
            }
        }
    }
}