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


public class CameraController : MonoBehaviour
{

    [Header("Camera Settings")]
    public float cameraHeight = 600f; // Высота камеры над целью
    public float cameraDistance = 700f; // Расстояние от камеры до цели
    public float rotationSpeed = 5f; // Скорость плавного поворота

    public Vector3 cameraTargetPoint; // Точка, на которую смотрит камера

    public uint sourceX;
    public uint sourceY;
    public uint sourceZ;

    public int currentCameraRotation = 0; // Текущий угол вращения (0-7)
    private bool isCameraRotating = false;
    private Quaternion targetCameraRotation;


    public void SetCamTargetXY(uint rotate, uint xx, uint yy, uint zz)
    {
        sourceX = xx;
        sourceY = yy;
        sourceZ = zz;

        float targetX = (int)xx;
        float targetY = (int)yy;
        float targetZ = (int)zz;

        // Устанавливаем целевую точку
        cameraTargetPoint = new Vector3(targetX, targetY, targetZ);

        // Преобразуем вращение (0-7 в 0-315 градусов с шагом 45)
        float targetAngle = ResourceManager.ConvertGameRotation(rotate);

        // Обновляем текущее вращение
        currentCameraRotation = (int)rotate;

        // Немедленно устанавливаем позицию и вращение камеры
        UpdateCameraPositionImmediate(targetAngle);

        //Debug.Log($"Camera target: {cameraTargetPoint}, Rotation: {targetAngle}° (index: {rotate})");
    }

    // Немедленное обновление позиции камеры
    private void UpdateCameraPositionImmediate(float angle)
    {
        // Преобразуем угол в радианы
        float radAngle = angle * Mathf.Deg2Rad;

        // Вычисляем смещение камеры от целевой точки
        Vector3 cameraOffset = new Vector3(
            Mathf.Sin(radAngle) * cameraDistance,
            cameraHeight, // Фиксированная высота над целью
            Mathf.Cos(radAngle) * cameraDistance
        );

        // Устанавливаем позицию камеры
        transform.position = cameraTargetPoint + cameraOffset;

        // Камера всегда смотрит на целевую точку
        transform.LookAt(cameraTargetPoint);
    }

    // Метод для плавного поворота камеры на заданный угол (если понадобится)
    public void RotateCameraSmoothly(int targetRotationIndex)
    {
        if (isCameraRotating) return;

        targetRotationIndex = targetRotationIndex % 8;
        if (targetRotationIndex == currentCameraRotation) return;

        StartCoroutine(SmoothRotationCoroutine(targetRotationIndex));
    }

    // Корутина для плавного вращения
    private IEnumerator SmoothRotationCoroutine(int targetRotationIndex)
    {
        isCameraRotating = true;


        float startAngle = currentCameraRotation * 45f;
        float targetAngle = targetRotationIndex * 45f;
        float progress = 0f;

        // Корректируем для кратчайшего пути вращения
        float angleDifference = Mathf.DeltaAngle(startAngle, targetAngle);
        if (Mathf.Abs(angleDifference) > 180f)
        {
            targetAngle = startAngle + (angleDifference > 0 ? angleDifference - 360f : angleDifference + 360f);
        }

        Vector3 startPosition = transform.position;

        while (progress < 1f)
        {
            progress += Time.deltaTime * rotationSpeed;
            float currentAngle = Mathf.Lerp(startAngle, targetAngle, progress);

            // Обновляем позицию камеры
            float radAngle = currentAngle * Mathf.Deg2Rad;
            Vector3 cameraOffset = new Vector3(
                Mathf.Sin(radAngle) * cameraDistance,
                cameraHeight,
                Mathf.Cos(radAngle) * cameraDistance
            );

            transform.position = cameraTargetPoint + cameraOffset;
            transform.LookAt(cameraTargetPoint);

            yield return null;
        }

        // Финализируем позицию
        currentCameraRotation = targetRotationIndex;
        UpdateCameraPositionImmediate(targetRotationIndex * 45f);

        isCameraRotating = false;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
