using System;
using System.Collections.Generic;
using UnityEngine;

public class MoveObjectController : MonoBehaviour
{
    public static MoveObjectController Instance;
    private ObjectMoveEnum moveType = ObjectMoveEnum.None;
    private GameObject movementObject;
    private float cameraZDistance;
    private Vector3 targetPosition;
    private bool isMove;
    private Vector3 offset;
    private Vector3 newWorldPosition;
    private Vector3 lastWorldCoordinats;
    private Vector3 lastMovePosition;
    private Quaternion lastRotation = Quaternion.identity;
    private Vector3 directionMove = Vector3.zero;
    private bool objectMove;
    private ParentObject parentObject;

    public bool IsListenLastPosition { get; set; } = true;

    public void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
    }

    public void SetMoveType(ObjectMoveEnum type, GameObject currentObject)
    {
        moveType = type;
        movementObject = currentObject;
        parentObject = currentObject.GetComponentInChildren<ParentObject>();
        lastWorldCoordinats = movementObject.transform.position;
        lastMovePosition = movementObject.transform.position;
        lastRotation = movementObject.transform.rotation;
    }

    public void ResetMoveType()
    {
        moveType = ObjectMoveEnum.None;
        movementObject = null;
        isMove = false;
    }

    public void ReturnToLastPos(Vector3 lastPos)
    {
        movementObject.transform.position = lastPos;
        movementObject.transform.rotation = lastRotation;
    }

    public Vector3 GetLastPosition()
    {
        return lastMovePosition;
    }

    private void FixedUpdate()
    {
        switch (moveType)
        {
            case ObjectMoveEnum.None:
                return;
            case ObjectMoveEnum.LeftRight:
                MoveLeftRight();
                break;
            case ObjectMoveEnum.RotateX:
            case ObjectMoveEnum.RotateY:
                RotateXY();
                break;
            case ObjectMoveEnum.UpDown:
                MoveUpDown();
                break;
        }
    }

    private void MoveLeftRight()
    {
        cameraZDistance = Camera.main.WorldToScreenPoint(movementObject.transform.position).z;
        Vector3 screenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, cameraZDistance);
        newWorldPosition = Camera.main.ScreenToWorldPoint(screenPosition);

        if (!isMove)
        {
            offset = movementObject.transform.position - newWorldPosition;
            isMove = true;
        }

        offset.y = 0;
        directionMove = (newWorldPosition - lastWorldCoordinats).normalized;
        directionMove.y = 0;

        float distanceToMove = Vector3.Distance(lastWorldCoordinats, newWorldPosition);
        Vector3 targetPosition = new Vector3(newWorldPosition.x, movementObject.transform.position.y, newWorldPosition.z) + offset;
        
        if (Physics.Raycast(movementObject.transform.position, directionMove, out RaycastHit hit, distanceToMove))
        {
            targetPosition = hit.point; 
        }
        
        parentObject.MoveObject((targetPosition - movementObject.transform.position) / Time.deltaTime);
        
      //  parentObject.MoveObject((targetPosition - movementObject.transform.position) / Time.deltaTime);

        lastWorldCoordinats = newWorldPosition;
        
    }
    
    private void RotateXY()
    {
        float axisX = Input.GetAxis("Mouse X");
        float axisY = Input.GetAxis("Mouse Y");
        
        if (moveType == ObjectMoveEnum.RotateX)
        {
            movementObject.transform.eulerAngles += new Vector3(0, axisX * 10, 0);
        }
        else if (moveType == ObjectMoveEnum.RotateY)
        {
            movementObject.transform.eulerAngles += new Vector3(axisY * 10, 0, 0);
        }
    }

    public void MoveUpDown()
    {
        float axisY = Input.GetAxis("Mouse Y");
        float posY = movementObject.transform.position.y;

        if (posY <= 0 && axisY <= 0)
        {
            movementObject.transform.position = new Vector3(movementObject.transform.position.x, 0, movementObject.transform.position.z);
            return;
        }
        movementObject.transform.position += new Vector3(0, axisY / 2, 0);
    }
}