#if UNITY_2023_2_OR_NEWER
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;

namespace Unity.Cinemachine.Editor
{
    class CinemachineCameraViewpoint : Viewpoint<CinemachineCamera>, ICameraLensData
    {
        public CinemachineCameraViewpoint(CinemachineCamera target) : base(target)
        {
        }

        public override Quaternion Rotation
        {
            get => base.Rotation;
            set
            {
                base.Rotation = value;
                Target.InternalUpdateCameraState(Vector3.up, 0f);
            }
        }

        public override Vector3 Position 
        { 
            get => base.Position; 
            set
            {
                base.Position = value;
                Target.InternalUpdateCameraState(Vector3.up, 0f);
            }
        }

        public float FieldOfView
        {
            get => Target.Lens.FieldOfView;
            set
            {
                var currentLens = Target.Lens;
                currentLens.FieldOfView = value;
                Target.Lens = currentLens;
            }
        }

        public float FocalLength
        {
            get
            {
                return Camera.FieldOfViewToFocalLength(Target.Lens.FieldOfView, Target.Lens.PhysicalProperties.SensorSize.y);
            }
            set
            {
                var currentLens = Target.Lens;
                currentLens.FieldOfView = Camera.FocalLengthToFieldOfView(value, Target.Lens.PhysicalProperties.SensorSize.y);
                Target.Lens = currentLens;
            }
        }

        public bool Orthographic
        {
            get => Target.Lens.Orthographic;
            set
            {
                var currentLens = Target.Lens;
                currentLens.ModeOverride = (value) ? LensSettings.OverrideModes.Orthographic : LensSettings.OverrideModes.None;
                Target.Lens = currentLens;
            }
        }

        public float OrthographicSize
        {
            get => Target.Lens.OrthographicSize;
            set
            {
                var currentLens = Target.Lens;
                currentLens.OrthographicSize = value;
                Target.Lens = currentLens;
            }
        }

        public float NearClipPlane => Target.Lens.NearClipPlane;

        public float FarClipPlane => Target.Lens.FarClipPlane;

        public bool UsePhysicalProperties => Target.Lens.IsPhysicalCamera;

        public Vector2 SensorSize => Target.Lens.PhysicalProperties.SensorSize;

        public Vector2 LensShift => Target.Lens.PhysicalProperties.LensShift;

        public Camera.GateFitMode GateFit => Target.Lens.PhysicalProperties.GateFit;

        // TODO: Surface text message through a Label to the user to tell when a constraint is being changed.
        //public override VisualElement CreateVisualElement()
        //{
        //    return new VisualElement();
        //}
    }
}
#endif