using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using AX.NetworkSystem;

/// <summary>
/// 房间中用户列表的显示与刷新
/// </summary>
public class MainPanel : MonoBehaviour
{
    /// <summary>
    /// Content下的所有子物体
    /// </summary>
    public ItemRoleType[] allrolearr;
    public Transform Content;
    public GameObject RoleItem;
    public Sprite RoleReadyBG;
    public Sprite RoleWaitBG;
    public Sprite RoleSelf;
    public Toggle Redytoggle;
    /// <summary>
    /// 当前房间用户列表
    /// </summary>
    public List<UserData> nowUserDataList = new List<UserData>();

    List<UserData> updateUserDataList = new List<UserData>();


    List<Role> rolelist = new List<Role>();
    public static MainPanel Instance;
    // Use this for initialization
    void Awake()
    {

        if (GameSettings.othersSettings.mode==Mode.DisasterManagement)
        {
            return;
        }
        NetworkManager.Default.SendRequestAsync("GET_ROOM_USERLIST_REQUEST", CurrentUserInfo.room.Id);

    }
    void Start()
    {
        Instance = this;
    }
    /// <summary>
    /// 当前用户加入房间等待
    /// </summary>
    public void startShowItem()
    {
        //showAllPanel();
        hideuselessPanel(nowUserDataList);
        //因为可能room_enter_sync比awake里的GET_ROOM_USERLIST先执行,所以要把有的都删掉
        RoleItem[] all = GetComponentsInChildren<RoleItem>();
        if (all.Length>0)
        {
            for (int i = 0; i < all.Length; i++)
            {
                Destroy(all[i].gameObject);
            }
        }
        
        CreatRoleItem(nowUserDataList);
        var roomUserNum = transform.parent.Find("RoomInfoPanel/Panel/RoonNum/Text");
        roomUserNum.GetComponent<Text>().text = CurrentUserInfo.room.UserList.Count.ToString() + "/32";
    }
    /// <summary>
    /// 显示Content下的所有panel
    /// </summary>
    public void showAllPanel()
    {
        for (int i = 0; i < Content.childCount; i++)
        {
            if (!Content.GetChild(i).gameObject.activeSelf)
            {
                Content.GetChild(i).gameObject.SetActive(true);
            }
        }
    }
    /// <summary>
    /// 隐藏无用的UI(当前房间里没有选择的角色对应的ui)
    /// </summary>
    public void hideuselessPanel(List<UserData> UdataList)
    {
        rolelist.Clear();
        //showAllPanel();
        foreach (var userdata in UdataList)
        {
            if (!rolelist.Contains(userdata.Role))
            {
                rolelist.Add(userdata.Role);
            }
        }
        
        //ItemRoleType[] allrolearr =Content.GetComponentsInChildren<ItemRoleType>();
        for (int i = 0; i < allrolearr.Length; i++)
        {
            if (!rolelist.Contains(allrolearr[i].role))
            {
                allrolearr[i].gameObject.SetActive(false);
            }
            else
            {
                if (!allrolearr[i].gameObject.activeInHierarchy)
                {
                    allrolearr[i].gameObject.SetActive(true);
                }
            }
        }
    }
    /// <summary>
    /// 后加入角色panel显示
    /// </summary>
    /// <param name="udata"></param>
    public void ShowNewRolePanel(UserData udata)
    {
        for (int i = 0; i < allrolearr.Length; i++)
        {
            if (allrolearr[i].role == udata.Role)
            {
                if (!allrolearr[i].gameObject.activeInHierarchy)
                {
                    allrolearr[i].gameObject.SetActive(true);
                }
            }
        }
    }
    /// <summary>
    /// 角色离开房间,并且角色UI被摧毁后调用
    /// </summary>
    /// <param name="udata"></param>
    public void HideRolePanelWhileLevel(UserData udata)
    {
        bool empty = false;
        for (int i = 0; i < allrolearr.Length; i++)
        {
            if (allrolearr[i].role == udata.Role)
            {
                if (allrolearr[i].gameObject.activeInHierarchy)
                {
                    if (!allrolearr[i].GetComponentInChildren<RoleItem>() && allrolearr[i].panelType == PanelType.Role)
                    {
                        empty = true;
                    }
                }
                if (empty)
                {
                    allrolearr[i].gameObject.SetActive(false);
                }
            }
        }
    }

    /// <summary>
    /// 创建RoleItem
    /// </summary>
    public void CreatRoleItem(List<UserData> UdataList)
    {
        for (int i = 0; i < UdataList.Count; i++)
        {
            for (int j = 0; j < allrolearr.Length; j++)
            {
                if (UdataList[i].Role == allrolearr[j].role && allrolearr[j].panelType == PanelType.Role)
                {
                    GameObject item = Instantiate(RoleItem, allrolearr[j].transform) as GameObject;
                    item.name = UdataList[i].UserInfo.RealName;
                    bool isready = UdataList[i].IsReady;
                    item.GetComponent<RoleItem>().userData = UdataList[i];
                    item.transform.Find("NameText").GetComponent<Text>().text = UdataList[i].UserInfo.RealName;
                    item.transform.Find("RoleText").GetComponent<Text>().text = UdataList[i].Role.ToString();
                    PrepareSet(item, isready);
                    //if (UdataList[i].UserInfo.Id == CurrentUserInfo.mySelf.Id && UdataList[i].UserInfo.Id != CurrentUserInfo.room.Owner.UserInfo.Id)
                    //{
                    //    item.GetComponent<Image>().sprite = RoleSelf;
                    //    item.GetComponent<Image>().type = Image.Type.Sliced;//fillMethod = Image.FillMethod.Horizontal;
                    //   // item.GetComponent<ReadyToggle>().Myself = item;
                    //}
                    //if (UdataList[i].UserInfo.Id == CurrentUserInfo.mySelf.Id&&UdataList[i].UserInfo.Id == CurrentUserInfo.room.Owner.UserInfo.Id)
                    //{
                    //    item.GetComponent<Image>().sprite = RoleSelf;
                    //    item.GetComponent<Image>().type = Image.Type.Sliced;
                    //    item.transform.Find("Image").gameObject.SetActive(true);
                    //    item.transform.Find("ReadyImage").gameObject.SetActive(false);
                    //    item.transform.Find("WaitImage").gameObject.SetActive(false);
                    //}
                }
            }
        }
    }


    /// <summary>
    /// 准备状态设置
    /// </summary>
    /// <param name="RoleItem">要设置的RoleItem</param>
    /// <param name="ready">要更改的准备状态</param>
    void PrepareSet(GameObject RoleItem, bool ready)
    {
        if (ready)
        {
            RoleItem.GetComponent<Image>().sprite = RoleReadyBG;
            RoleItem.transform.Find("ReadyImage").gameObject.SetActive(true);
            RoleItem.transform.Find("WaitImage").gameObject.SetActive(false);
        }
        else
        {
            RoleItem.GetComponent<Image>().sprite = RoleWaitBG;
            RoleItem.transform.Find("ReadyImage").gameObject.SetActive(false);
            RoleItem.transform.Find("WaitImage").gameObject.SetActive(true);
        }
        //自己,并且自己不是房主
        if (RoleItem.GetComponent<RoleItem>().userData.UserInfo.Id == CurrentUserInfo.mySelf.Id && CurrentUserInfo.mySelf.Id != CurrentUserInfo.room.Owner.UserInfo.Id)
        {
            RoleItem.GetComponent<Image>().sprite = RoleSelf;
            RoleItem.GetComponent<Image>().type = Image.Type.Sliced;
        }
        //是房主
        if (RoleItem.GetComponent<RoleItem>().userData.UserInfo.Id == CurrentUserInfo.room.Owner.UserInfo.Id)
        {
            RoleItem.transform.Find("ReadyImage").gameObject.SetActive(false);
            RoleItem.transform.Find("WaitImage").gameObject.SetActive(false);

            RoleItem.GetComponent<Image>().sprite = RoleSelf;
            RoleItem.GetComponent<Image>().type = Image.Type.Sliced;
            RoleItem.transform.Find("Image").gameObject.SetActive(true);

        }
    }

    /// <summary>
    /// 用户离开房间删除该用户UI
    /// </summary>
    /// <param name="udata"></param>
    public void RemoveRoleItem(UserData udata)
    {
        RoleItem[] allroleitem = GetComponentsInChildren<RoleItem>();
        for (int i = 0; i < allroleitem.Length; i++)
        {
            if (allroleitem[i].userData.UserInfo.Id == udata.UserInfo.Id)
            {
                Destroy(allroleitem[i].gameObject);
            }
        }
    }

    /// <summary>
    /// 踢出房间更新
    /// </summary>
    /// <param name="role"></param>
    /// <param name="ulist"></param>
    public void delectFormRoomFunction()
    {
        //新的用户列表
        updateUserDataList = CurrentUserInfo.room.UserList;
        //已画出的RoleItem的用户
        RoleItem[] roleitemarr = Content.GetComponentsInChildren<RoleItem>();


        //要被踢出的列表
        List<UserData> kickOutList = new List<UserData>();
        //筛选踢出人员
        for (int i = 0; i < nowUserDataList.Count; i++)
        {
            if (!updateUserDataList.Contains(nowUserDataList[i]))
            {
                kickOutList.Add(nowUserDataList[i]);
            }
        }
        //从UI上移除
        for (int i = 0; i < kickOutList.Count; i++)
        {
            for (int j = 0; j < roleitemarr.Length; j++)
            {
                if (roleitemarr[j].userData == kickOutList[i])
                {
                    Destroy(roleitemarr[j].gameObject);
                }
            }
        }
        nowUserDataList = updateUserDataList;
        //ToDo:移除房间请求
        //ToDo:返回大厅请求
        hideuselessPanel(updateUserDataList);
    }

    /// <summary>
    /// 用户状态更新,接收到用户状态更新消息后调用
    /// </summary>
    public void UpdateUserStateFunction(long UdataId, bool isReady)
    {
        //更改房间列表里用户的状态
        for (int j = 0; j < CurrentUserInfo.room.UserList.Count; j++)
        {
            if (CurrentUserInfo.room.UserList[j].UserInfo.Id == UdataId)
            {
                CurrentUserInfo.room.UserList[j].IsReady = isReady;
            }
            //Debug.Log(CurrentUserInfo.room.UserList[j].IsReady);
        }
        //当前已经画出的用户
        RoleItem[] roleItemArr = Content.GetComponentsInChildren<RoleItem>();
        //更改UI显示
        for (int i = 0; i < roleItemArr.Length; i++)
        {
            if (roleItemArr[i].userData.UserInfo.Id == UdataId)
            {
                roleItemArr[i].userData.IsReady = isReady;
                PrepareSet(roleItemArr[i].gameObject, isReady);
            }
        }
    }

    /// <summary>
    /// 是否除房主外都准备完毕
    /// </summary>
    /// <returns></returns>
    public bool IsAllReadyExcludeOwner()
    {
        bool allready = true;
        updateUserDataList = CurrentUserInfo.room.UserList;
        for (int i = 0; i < updateUserDataList.Count; i++)
        {
            if (updateUserDataList[i].UserInfo.Id != CurrentUserInfo.room.Owner.UserInfo.Id)
            {
                if (!updateUserDataList[i].IsReady)
                {
                    allready = false;
                }
            }
        }
        return allready;
    }
}