﻿using DG.Tweening;
using UnityEngine;

namespace JasonStorey
{
    class AnimateInFrom : VisibilityStrategy
    {
        readonly RectTransform _rect;

        Vector2 _startingPosition;
        Vector2 _offset;

        float _showDuration = 0.5f;
        float _hideDuration = 0.5f;
        
        public AnimateInFrom(RectTransform rect,Side side,float additionalOffset = 0)
        {
            _rect = rect;
            _startingPosition = rect.anchoredPosition;
            _offset = CalculateOffset(rect, side,additionalOffset);
        }

        Vector2 CalculateOffset(RectTransform rect, Side side,float additionalOffset = 0)
        {
            var sizeDelta = rect.sizeDelta;
            return side switch
            {
                Side.Top => new Vector2(0, sizeDelta.y + additionalOffset),
                Side.Bottom => new Vector2(0, -sizeDelta.y + additionalOffset),
                Side.Left => new Vector2(-sizeDelta.x - additionalOffset, 0),
                Side.Right => new Vector2(sizeDelta.x + additionalOffset, 0),
                _ => Vector2.zero
            };
        }

        public void Show()
        {
            DOTween.Kill(_rect);
            _rect.DOAnchorPos(_startingPosition,_showDuration).SetEase(Ease.OutSine);
            IsShowing = true;
        }

        public void Hide()
        {
            DOTween.Kill(_rect);
            _rect.DOAnchorPos(_startingPosition+_offset,_hideDuration).SetEase(Ease.InCirc);
            IsShowing = false;
        }

        public void TurnOn()
        {
            DOTween.Kill(_rect);
            _rect.anchoredPosition = _startingPosition;
            IsShowing = true;
        }

        public void TurnOff()
        {
            DOTween.Kill(_rect);
            _rect.anchoredPosition = _startingPosition + _offset;
            IsShowing = false;
        }

        public bool IsShowing { get; private set; }
    }
}