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

public class DisasterItem : MonoBehaviour {

    private Button LoadDisasterBtn;
    private Toggle toggle;

    private Text disasterItro;
    private Text victoryCondition;
    private Text timeSpeed;
    private Text XiaQZDName;
    private Text personCount;
    private InputField roomName;
    private InputField roomPassword;

    public MapType mapType;
    private int maxPersons;

    public string fullName;
    private Slider Progress;
    public string myPath;
    private DisasterLibraryFile disaster = new DisasterLibraryFile();

    public long disasterMetaDataId;
    // Use this for initialization
    void Start () {
        if (!transform.name.Contains("Custom"))
        {
            LoadDisasterBtn = transform.Find("Button").GetComponent<Button>();
            LoadDisasterBtn.onClick.AddListener(LoadDisaster);

            Progress = transform.Find("NotLoad/Slider").GetComponent<Slider>();
        }

        toggle = transform.Find("Toggle").GetComponent<Toggle>();
        toggle.onValueChanged.AddListener(RefreshDisasterInfo);

        disasterItro = GameObject.Find("DisasterInfo/DisasterIntro/Scroll View/Viewport/Content/Text").GetComponent<Text>();
        victoryCondition = GameObject.Find("DisasterInfo/VictoryConditions/Scroll View/Viewport/Content/Text").GetComponent<Text>();
        if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
        {//演习模式或者练习模式下:创建房间;等于DisasterManagement是创建灾情库
            timeSpeed = GameObject.Find("DisasterInfo/Time/Speed").GetComponent<Text>();
            XiaQZDName = GameObject.Find("DisasterInfo/XiaQuZhongDui/Name").GetComponent<Text>();
            personCount = GameObject.Find("DisasterInfo/MaxPerson/PersonCount").GetComponent<Text>();
            roomName = GameObject.Find("DisasterInfo/RoomName/InputField").GetComponent<InputField>();
            roomPassword = GameObject.Find("DisasterInfo/RoomPassword/InputField").GetComponent<InputField>();
        }
    }

    private void OnDestroy()
    {
        if (!transform.name.Contains("Custom"))
        {
            LoadDisasterBtn.onClick.RemoveListener(LoadDisaster);
        }
       
        toggle.onValueChanged.RemoveListener(RefreshDisasterInfo);
    }

    private void LoadDisaster()
    {
        Progress.gameObject.SetActive(true);

        NetworkManager.Default.DownloadFileAsync(fullName, ProgressHandle, Completed);
    }

    private void ProgressHandle(string fullname, float progress)
    {
        Progress.value = progress / 100;
    }

    private void Completed(string fullname)
    {
        var str = fullname.Split('/');

        myPath = Application.streamingAssetsPath + "/DisasterLibrary/" + str[str.Length - 1];
        File.Move(fullname, myPath);

        Progress.gameObject.SetActive(false);
        Progress.value = 0;

        Progress.transform.parent.gameObject.SetActive(false);
        LoadDisasterBtn.gameObject.SetActive(false);
    }

    private void RefreshDisasterInfo(bool flag)
    {
        if (flag)
        {
            if (transform.name.Contains("Custom"))
            {
                disasterItro.text = "XXXX";
                victoryCondition.text = "XXXX";
                
                timeSpeed.text = "XXX";
                XiaQZDName.text = mapType.areaSquadron;
                maxPersons = GameObject.Find("Canvas/Background/CreateRoom").GetComponent<GET_MAX_PERSONS_REPLY>().maxPersons;
                personCount.text = maxPersons.ToString();
            }
            else
            {
                //练习模式,演习模式,创建灾情库都需要
                //需从灾情库下载的灾情,从灾情元数据里读取出来赋值
                ReadDisaster(myPath, disaster);

                disasterItro.text = disaster.DisasterIntro;

                string vc = "";
                if (disaster.VictoryCondition.Count != 0)
                {
                    vc = "出现以下任意 " + "<color=red>" + disaster.VictoryCondition.Count + "</color>" + ", 则宣告演练失败:";
                    if (disaster.VictoryCondition.BurnedArea > 0 )
                    {
                        vc = vc + "\n" + "1. 火灾面积超过 " + "<color=red>" + disaster.VictoryCondition.BurnedArea + "</color>" + " 平米";
                    }
                    if (disaster.VictoryCondition.FireManDied > 0)
                    {
                        vc = vc + "\n" + "2. 消防员牺牲 " + "<color=red>" + disaster.VictoryCondition.FireManDied + "</color>" + " 名";
                    }
                    if (disaster.VictoryCondition.UnRescued > 0)
                    {
                        vc = vc + "\n" + "3. 伤员/被困人员有 " + "<color=red>" + disaster.VictoryCondition.UnRescued + "</color>" + " 名未救出";
                    }
                    if (disaster.VictoryCondition.BurnedTime > 0)
                    {
                        vc = vc + "\n" + "4. 火灾超过 " + "<color=red>" + disaster.VictoryCondition.BurnedTime + "</color>" + " 个小时未扑灭";
                    }
                }
                else
                {
                    vc = "此灾情没有设置胜利条件!";
                }
                
                victoryCondition.text = vc;

                if (GameSettings.othersSettings.mode != Mode.None && GameSettings.othersSettings.mode != Mode.DisasterManagement)
                {
                    timeSpeed.text = "XXX";
                    XiaQZDName.text = mapType.areaSquadron;
                    maxPersons = GameObject.Find("Canvas/Background/CreateRoom").GetComponent<GET_MAX_PERSONS_REPLY>().maxPersons;
                    personCount.text = maxPersons.ToString();
                }
            }

            if (GameSettings.othersSettings.mode != Mode.None )
            {
                if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
                {
                    GameObject.Find("Canvas/Background/CreateRoom/CreateRoomBtn").GetComponent<CreateRoom>().mapType = mapType;
                    if (transform.name.Contains("Custom"))
                    {
                        GameSettings.othersSettings.isSelectedDisaster = false;
                    }
                    else
                    {
                        GameSettings.othersSettings.isSelectedDisaster = true;
                        GameSettings.othersSettings.disaster = disaster;
                    }
                }
                else
                {
                    GameObject.Find("ViewButton").GetComponent<DisasterView>().mapType = mapType;
                    GameObject.Find("EditButton").GetComponent<DisasterEdit>().mapType = mapType;
                    GameObject.Find("DeleteButton").GetComponent<DisasterDelete>().mapType = mapType;

                    GameObject.Find("DeleteButton").GetComponent<DisasterDelete>().disasterMetaDataId = disasterMetaDataId;

                    GameSettings.othersSettings.disaster = disaster;
                }
            }
        }
        else
        {
            disasterItro.text = "";
            victoryCondition.text = "";
            if (GameSettings.othersSettings.mode != Mode.None && GameSettings.othersSettings.mode != Mode.DisasterManagement)
            {
                timeSpeed.text = "";
                XiaQZDName.text = "";
                maxPersons = 0;
                personCount.text = maxPersons.ToString();
            }

            if (GameSettings.othersSettings.mode != Mode.None)
            {
                if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
                {
                    GameObject.Find("Canvas/Background/CreateRoom/CreateRoomBtn").GetComponent<CreateRoom>().mapType = null;
                }
                else
                {
                    GameObject.Find("ViewButton").GetComponent<DisasterView>().mapType = null;
                    GameObject.Find("EditButton").GetComponent<DisasterEdit>().mapType = null;
                    GameObject.Find("DeleteButton").GetComponent<DisasterDelete>().mapType = null;
                }
            }
        }
    }

    /// <summary>
    /// 读取下载的灾情文件,并反序列化成灾情
    /// </summary>
    /// <param name="path">文件路径</param>
    /// <param name="disaster"></param>
    private void ReadDisaster(string path, DisasterLibraryFile dst)
    {
        if (File.Exists(path))
        {
            var fileAllBytes = File.ReadAllBytes(path);

            dst = fileAllBytes.CompressedTypelessDeserialize() as DisasterLibraryFile;

            disaster = dst;
        }
    }

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