using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using static TMPro.SpriteAssetUtilities.TexturePacker_JsonArray;
public class DragTest : MonoBehaviour
{
    /// 
    /// 锚点位置,放预制体最下面
    /// 
    private GameObject anchorPos;
    public List listTargets = new List();
    //[HideInInspector]
    public List frames = new List();
    [Header("该设备层数")]
    public int PerTier = 42;
    [Header("该区域设备数")]
    public int PerRow = 5;
    [Header("该物体容积层数")]
    public int volume;
    public bool isExit = false;
    public bool isClicked = false;
    public bool isTarget;
    /// 
    /// 是否已经放置
    /// 
    public bool isplace;
    public bool canPut;
    bool isray = false;
    bool finishPut;
    private void Start()
    {
        //Debug.Log("版本号 1.1.1");
        GetUList();
        canPut = true;
        anchorPos = transform.Find("锚点").gameObject;
        //finishPut = gameObject.GetComponent().isPut;
        //Debug.Log("版本号 1.1.1");
    }
    private void Update()
    {
        RaycastHit hit;
        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 999, 1 << 8 | 1 << 10))
        {
            isray = true;
        }
        else
        {
            isray = false;
        }
        if (finishPut == false)
        {
            if (Input.GetMouseButtonUp(0))
            {
                MouseUp();
            }
        }
    }
    IEnumerator OnMouseOver()
    {
        if (isray)
        {
            //三维物体坐标转屏幕坐标
            Vector3 screenSpace = Camera.main.WorldToScreenPoint(anchorPos.transform.position);
            //将鼠标屏幕坐标转为三维坐标,再计算物体位置与鼠标之间的距离
            var offset = anchorPos.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
            while (Input.GetMouseButton(0) && !finishPut)
            {
                finishPut = false;
                Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
                var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
                transform.position = curPosition;
                yield return null;
            }
        }
    }
    public void MouseUp()
    {
        //if (isray)
        {
            isTarget = false;
            foreach (GameObject item in listTargets)
            {
                if (GetOverGameObject(Camera.main.gameObject).Contains(item))
                {
                    //判断当前为第几个子物体
                    int rank = listTargets.IndexOf(item) + 1;
                    //移除设备
                    //if (item.transform.childCount >= 1)
                    //{
                    //    int v = item.transform.GetComponentInChildren().volume;
                    //    for (int i = 0; i < v; i++)
                    //    {
                    //        listTargets[rank - 1 + i].tag = "Untagged";
                    //    }
                    //    Destroy(item.transform.GetChild(0).gameObject);
                    //    break;
                    //}
                    int isarea = 1; int isrow = 1; int istier = 0;
                    bool allowPut = true;
                    //计算层、列、区域
                    for (int i = 1; i <= rank; i++)
                    {
                        if (istier < PerTier)
                        {
                            istier++;
                        }
                        else
                        {
                            if (isrow < PerRow)
                            {
                                isrow++;
                            }
                            else
                            {
                                isarea++;
                                isrow = 1;
                            }
                            istier = 1;
                        }
                    }
                    //剩下预留层数
                    int lower = 0;
                    lower = PerTier - istier + 1;
                    if (lower >= volume)
                    {
                        for (int i = 0; i < volume; i++)
                        {
                            if (listTargets[rank - 1 + i].CompareTag("Isput"))
                            {
                                allowPut = false;
                                Debug.Log("预留空间不足,不能放置该设备");
                                break;
                            }
                        }
                        if (allowPut)
                        {
                            ////设备第几个区域
                            //gameObject.GetComponent().mydata.area = isarea.ToString();
                            ////设备第几列
                            //gameObject.GetComponent().mydata.row = isrow.ToString();
                            ////设备第几层
                            //gameObject.GetComponent().mydata.tier = istier.ToString();
                            Debug.Log("该设备容积为:" + volume);
                            Debug.Log("第" + isarea + "区,第" + isrow + "台,第" + istier + "层");
                            transform.position = item.transform.position;
                            Collider collider = item.GetComponent();
                            //放到锚点位置
                            transform.position = new Vector3(anchorPos.transform.position.x, anchorPos.transform.position.y + collider.bounds.size.y / 2, anchorPos.transform.position.z);
                            //设置父物体
                            transform.SetParent(item.transform, true);
                            //给使用的格子打上标签
                            for (int i = 0; i < volume; i++)
                            {
                                listTargets[rank - 1 + i].tag = "Isput";
                            }
                            finishPut = true;
                            isTarget = true;
                            isplace = true;
                        }
                    }
                    else
                    {
                        Debug.Log("预留空间不足,不能放置该设备");
                    }
                }
            }
            if (isplace == false)
            {
                Destroy(gameObject);
            }
            else if (!isTarget && !isplace)
            {
                Destroy(gameObject);
            }
        }
    }
    //获取光标停留的3D物体
    public List GetOverGameObject(GameObject raycaster)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        PhysicsRaycaster pr = raycaster.GetComponent();
        List results = new List();
        pr.Raycast(pointerEventData, results);
        List listObjs = new List();
        if (results.Count != 0)
        {
            foreach (RaycastResult item in results)
            {
                //if (item.gameObject.layer != 7)
                //位子物体layer层要为6
                //if (item.gameObject.layer != 8) break;
                listObjs.Add(item.gameObject);
            }
        }
        return listObjs;
    }
    /// 
    /// 得到U位数量
    /// 
    public void GetUList()
    {
        for (int i = 0; i < frames.Count; i++)
        {
            for (int j = 0; j < PerTier; j++)
            {
                listTargets.Add(frames[i].transform.GetChild(j).gameObject);
            }
        }
    }
}