using UnityEngine;
using UnityEditor;
using Unity.Mathematics;
using static Unity.Mathematics.math;
using static Grid;
using Color = UnityEngine.Color;

[ExecuteAlways]
[SelectionBase]
[DisallowMultipleComponent]
public class GridUnit : MonoBehaviour
{

    public int3 Size = new(1, 1, 1);
    private Vector3 SizeInMeters => new(Size.x * CellSize, Size.y * CellSize, Size.z * CellSize);

    public float3 CenterOffset;

    [SerializeField, HideInInspector] private int3 cachedSize = new(1, 1, 1);
    [SerializeField, HideInInspector] private float3 cachedOffset;

    private bool isDirty => transform.hasChanged ||
                            !all(cachedOffset != CenterOffset) ||
                            !all(cachedSize == Size);

#if UNITY_EDITOR
    public void Update()
    {
        if (!isDirty)
        {
            return;
        }

        SnapUnit(transform, Size, CenterOffset);

        transform.hasChanged = false;

        cachedOffset = CenterOffset;
        cachedSize = Size;
    }

    [DrawGizmo(GizmoType.InSelectionHierarchy)]
    private static void DrawGizmo(GridUnit unit, GizmoType type)
    {
        Transform t = unit.transform;
        quaternion rotation = t.rotation;
        var position = (float3)t.position + mul(rotation, unit.CenterOffset);

        Gizmos.color = Color.white;
        Gizmos.matrix = Matrix4x4.TRS(position, rotation, Vector3.one);
        Gizmos.DrawWireCube(Vector3.zero, unit.SizeInMeters);
    }
#endif
}
