using UnityEngine;
using System.Collections;

public class DoorController : MonoBehaviour, IInteractable
{
    [Header("Settings")]
    [SerializeField] private float openAngle = 90f; 
    [SerializeField] private float smoothSpeed = 2f; 
    [SerializeField] private bool isLocked = false;
    
    [Header("Key Settings")]
    [SerializeField] private ItemData keyRequired; 

    private bool _isOpen = false;
    private Quaternion _closedRotation;
    private Quaternion _openRotation;
    private Coroutine _animationCoroutine; 

    private void Start()
    {
        _closedRotation = transform.localRotation;
        _openRotation = _closedRotation * Quaternion.Euler(0, openAngle, 0);
    }

    public void Interact()
    {
        if (_isOpen)
        {
            Close();
        }
        else
        {
            TryOpen();
        }
    }

    public string GetDescription()
    {
        if (isLocked) return "Заперто (Нужен ключ)";
        return _isOpen ? "Закрыть" : "Открыть";
    }

    private void TryOpen()
    {
        if (isLocked)
        {
            if (keyRequired != null && InventorySystem.Instance.HasItem(keyRequired))
            {
                Debug.Log("Ключ подошел! Дверь открыта.");
                isLocked = false;
                Open();
            }
            else
            {
                Debug.Log("Нужен ключ!");
            }
        }
        else
        {
            Open();
        }
    }

    private void Open()
    {
        _isOpen = true;
        StopAnimation();
        _animationCoroutine = StartCoroutine(AnimateDoor(_openRotation));
    }

    private void Close()
    {
        _isOpen = false;
        StopAnimation();
        _animationCoroutine = StartCoroutine(AnimateDoor(_closedRotation));
    }

    private void StopAnimation()
    {
        if (_animationCoroutine != null) StopCoroutine(_animationCoroutine);
    }

    // Универсальная корутина для плавного вращения
    private IEnumerator AnimateDoor(Quaternion targetRotation)
    {
        while (Quaternion.Angle(transform.localRotation, targetRotation) > 0.1f)
        {
            transform.localRotation = Quaternion.Slerp(transform.localRotation, targetRotation, Time.deltaTime * smoothSpeed);
            yield return null;
        }
        transform.localRotation = targetRotation;
    }
}