using TMPro;
using UnityEngine;

public class CarEntryController : MonoBehaviour
{
    [Header("玩家")]
    [SerializeField] private Transform player;
    [SerializeField] private Camera playerCamera;
    [SerializeField] private CharacterController characterController;
    [SerializeField] private MonoBehaviour movementScript;
    [Header("汽车")]
    [SerializeField] private Transform driverSeatPoint;
    [SerializeField] private Transform exitPoint;
    [Header("汽车系统")]
    [SerializeField] private CarPhysicsController carPhysicsController;
    [SerializeField] private CarHeadlightController carHeadlightController;
    [Header("交互")]
    [SerializeField] private PlayerInputHandler inputHandler;
    [SerializeField] private Collider driverDoorCollider;
    [SerializeField] private Collider interiorExitCollider;
    [SerializeField] private float interactionRange = 10f;
    [SerializeField] private LayerMask interactionLayers = ~0;
    [Header("交互UI")]
    [SerializeField] private GameObject interactionPrompt;
    [SerializeField] private TMP_Text interactionPromptText;

    public bool IsPlayerInside { get; private set; }

    private void Update()
    {
        if (playerCamera == null || inputHandler == null)
        {
            Debug.LogWarning("CarEntryController: Player Camera or Input Handler is missing!", this);
            return;
        }
        UpdateInteractionPrompt();
        if (inputHandler.InteractPressed)
        {
            Debug.Log("E按下 - 检查汽车交互.", this);
            inputHandler.ConsumeInteract();
            if (IsPlayerInside)
            {
                Debug.Log("玩家在汽车内。检查出口.", this);
                if (IsLookingAt(interiorExitCollider))
                {
                    ExitCar();
                }
                else
                {
                    Debug.Log("射线未击中内部出口碰撞器.");
                }
            }
            else
            {
                Debug.Log("玩家在外面。检查驾驶门.", this);
                if (IsLookingAt(driverDoorCollider))
                {
                    EnterCar();
                }
                else
                {
                    Debug.Log("射线未击中驾驶门碰撞器.");
                }
            }
        }
    }

    private void UpdateInteractionPrompt()
    {
        Collider target = IsPlayerInside ? interiorExitCollider : driverDoorCollider;
        bool canInteract = IsLookingAt(target);
        if (interactionPrompt != null)
        {
            interactionPrompt.SetActive(canInteract);
        }
        if (canInteract && interactionPromptText != null)
        {
            interactionPromptText.text = IsPlayerInside ? "[E] 退出汽车" : "[E] 进入汽车";
        }
    }

    private bool IsLookingAt(Collider target)
    {
        if (target == null)
        {
            return false;
        }
        Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
        if (Physics.Raycast(ray, out RaycastHit hit, interactionRange, interactionLayers, QueryTriggerInteraction.Collide))
        {
            return hit.collider == target || hit.collider.transform.IsChildOf(target.transform);
        }
        return false;
    }

    private void EnterCar()
    {
        if (player == null || driverSeatPoint == null)
        {
            return;
        }
        SetMovementEnabled(false);
        TeleportPlayer(driverSeatPoint);
        IsPlayerInside = true;
        //if (carPhysicsController != null)
        //{
        //    carPhysicsController.SetDrivingEnabled(true);
        //}
        if (carHeadlightController != null)
        {
            carHeadlightController.SetHeadlights(true);
        }
    }

    private void ExitCar()
    {
        if (player == null || exitPoint == null)
        {
            return;
        }
        TeleportPlayer(exitPoint);
        IsPlayerInside = false;
        SetMovementEnabled(true);
        //if (carPhysicsController != null)
        //{
        //    carPhysicsController.SetDrivingEnabled(false);
        //}
        if (carHeadlightController != null)
        {
            carHeadlightController.SetHeadlights(false);
        }
    }

    private void TeleportPlayer(Transform destination)
    {
        if (characterController != null)
        {
            characterController.enabled = false;
        }
        player.SetPositionAndRotation(destination.position, destination.rotation);
        if (characterController != null)
        {
            characterController.enabled = true;
        }
    }

    private void SetMovementEnabled(bool enabledState)
    {
        if (movementScript != null)
        {
            movementScript.enabled = enabledState;
        }
    }
}