using AX.ImageViewer;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class EquipmentAttributePanel : UIView<CloneObject,CloneObjectReactive>
{
    //标题
    public Text TitleText;
    //位置
    public Text LocationText;
    public InputField LocationInput;
    //详情
    public Text DetailsText;
    public InputField DetailsInput;
    //图片类型
    public OriginalImageType ImageType;
    //图片面板
    public Image ImagePanel;
    //全景开关
    public Toggle ImageTypeToggle;
    //查看原图
    public Button ViewButton;
    public OpenImage OpenImageFile;
    //保存按钮
    public Button SaveButton;

    public GameObject ControllerPanel;
    public Toggle ControlTogle;
    public Slider ControlSizeSlider;

    private string url;
    public override void Awake()
    {
        base.Awake();
        #region DataSource Bind
        DataSource.Address.SubscribeToText(LocationText).AddTo(gameObject);
        DataSource.Address.SubscribeToText(LocationInput).AddTo(gameObject);
        DataSource.Discription.SubscribeToText(DetailsText).AddTo(gameObject);
        DataSource.Discription.SubscribeToText(DetailsInput).AddTo(gameObject);
        DataSource.ImageType.Subscribe(data =>
        {
            switch (data)
            {
                case OriginalImageType.Normal:
                    ImageTypeToggle.isOn = false;
                    break;
                case OriginalImageType.Panorama:
                    ImageTypeToggle.isOn = true;
                    break;
            }
        }).AddTo(gameObject);
        DataSource.ImageUrl.Subscribe(url =>
        {
            GetImage();
        }).AddTo(gameObject);
        DetailsInput.OnValueChangedAsObservable().Subscribe(s => DataSource.Discription.Value = s);
        LocationInput.OnValueChangedAsObservable().Subscribe(s => DataSource.Address.Value = s);
        ImageTypeToggle.OnValueChangedAsObservable().Subscribe(b =>
        {
            DataSource.ImageType.Value = b ? OriginalImageType.Panorama : OriginalImageType.Normal;
        }).AddTo(gameObject);
        #endregion
        #region Button Click
        //保存
        SaveButton.onClick.AsObservable().Subscribe(onClick =>
        {
            SaveData();
        }).AddTo(gameObject);
        //查看原图
        ViewButton.onClick.AsObservable().Subscribe(onClick =>
        {
            ViewImage();
        });
        //关闭
        transform.Find("TitleBar/CloseButton").GetComponent<Button>().OnClickAsObservable()
            .Subscribe(_ => Hide());
        //上传图片
        OpenImageFile.OnLoadTextureFinished = texture =>
        {
            UploadImage(texture);
        };

        //控制器
        ControlTogle.OnValueChangedAsObservable()
            .Subscribe(value =>
            {
                var go = SelectionManager.Instance.Sets.Find(o => o.name == DataSource.Id.Value);
                if (go != null)
                {
                    if (go.GetComponent<ModelMeshEditor>())
                    {
                        if (value)
                        {
                            go.GetComponent<ModelMeshEditor>().pointScale = ControlSizeSlider.value;
                            go.GetComponent<ModelMeshEditor>().CreateEditorPoint();
                        }
                        else
                        {
                            go.GetComponent<ModelMeshEditor>().DeleteEditorPoint();
                        }
                    }
                }

            });
        //控制器大小
        ControlSizeSlider.OnValueChangedAsObservable()
            .Subscribe(value =>
            {
                var go = SelectionManager.Instance.Sets.Find(o => o.name == DataSource.Id.Value);
                if (go != null)
                {
                    if (go.GetComponent<ModelMeshEditor>())
                    {
                        go.GetComponent<ModelMeshEditor>().pointScale = value;
                    }
                }
                   
            });
        #endregion
    }
    public override void Show()
    {
        base.Show();
        
        switch (EquipmentManager.Instance.CreationType)
        {
            case EquipmentType.FireClimbingSite:
                TitleText.text = "登高作业面";
                ControllerPanel.SetActive(true);
                url = string.Format(HttpManager.Instance.PostFireClimbingSitesById, DataSource.Id.Value);
                break;
            case EquipmentType.HazardSource:
                TitleText.text = "危险源";
                ControllerPanel.SetActive(false);
                url = string.Format(HttpManager.Instance.PostHazardSourcesById, DataSource.Id.Value);
                break;
            case EquipmentType.NoParking:
                TitleText.text = "禁停区";
                ControllerPanel.SetActive(true);
                url = string.Format(HttpManager.Instance.PostNoParkingAreasById, DataSource.Id.Value);
                break;
            case EquipmentType.KeyArea:
                TitleText.text = "重点提示";
                ControllerPanel.SetActive(false);
                url = string.Format(HttpManager.Instance.PostImportantLocationsById, DataSource.Id.Value);
                break;
            case EquipmentType.ImageMarked:
                TitleText.text = "图片标注";
                ControllerPanel.SetActive(false);
                url = string.Format(HttpManager.Instance.PostImageMarkersById, DataSource.Id.Value);
                break;
            case EquipmentType.EscapeWin:
                TitleText.text = "逃生窗";
                ControllerPanel.SetActive(false);
                url = string.Format(HttpManager.Instance.PostEscapeWinsById, DataSource.Id.Value);
                break;
            case EquipmentType.BreakPoint:
                TitleText.text = "破拆点";
                ControllerPanel.SetActive(false);
                url = string.Format(HttpManager.Instance.PostBreakPointsById, DataSource.Id.Value);
                break;

        }

        GetComponent<AttributePanelControl>().ResetPanel();
       
    }
    
    /// <summary>
    /// 保存数据
    /// </summary>
    public void SaveData()
    {
        GameObject tempGo = EquipmentManager.SpawObjects[EquipmentManager.Instance.CreationType][DataSource.Id.Value];
        DataSource.Position.Value = tempGo.transform.position;
        DataSource.Rotation.Value = tempGo.transform.rotation.eulerAngles;
        if(tempGo.transform.Find("Scene/Plane"))
            DataSource.MeshVertices.Value = tempGo.transform.Find("Scene/Plane").GetComponent<MeshFilter>()?.mesh.vertices;
        HttpManager.Instance.Post(url, DataSource.GetData());
    }
    /// <summary>
    /// 上传图片
    /// </summary>
    public void UploadImage(Texture2D texture)
    {
        HttpManager.Instance.PostImage($"{DataSource.Id}.jpg", texture, a =>
        {
            DataSource.ImageUrl.Value = a?.ObjectName;
        });
    }
    /// <summary>
    /// 获取图片
    /// </summary>
    void GetImage()
    {
        if (!string.IsNullOrEmpty(DataSource.ImageUrl.Value))
        {
            HttpManager.Instance.GetImage($"{ DataSource.ImageUrl.Value}?x-oss-process=image/resize,h_200", texture =>
            {
                ImagePanel.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
                ImagePanel.preserveAspect = true;
            });
        }
        else
        {
            ImagePanel.sprite = AssetManager.Instance.DefaultSprite;
        }

    }
    /// <summary>
    /// 查看原图
    /// </summary>
    public void ViewImage()
    {
        if (!string.IsNullOrEmpty(DataSource.ImageUrl.Value))
        {
            HttpManager.Instance.GetImage(DataSource.ImageUrl.Value, texture =>
            {
                switch (DataSource.ImageType.Value)
                {
                    case OriginalImageType.Normal:
                        ImageViewer.Load(texture);
                        break;
                    case OriginalImageType.Panorama:
                        PanoramicViewer.Load(texture);
                        break;
                }
            });
        }
        else
        {
            MessageBox.Show("未上传图片!", Color.white, 3f);
        }


    }
}