// CLEAN ME
    private void BtnOnClickCrate(Button crateBtn)
    {
        if (_status != LootCrateScreenStatus.NORMAL)
        {
            return;
        }

        SetNavButtonsEnabled(false);

        _status = LootCrateScreenStatus.OPEN_CRATE;

        _crateItems       = new List <LootCrateItem>();
        _currentLootCrate = crateBtn.GetComponentInParent <LootCrateBox>();

        Rect        parentRect = this.parentRect;
        Transform   btnParent  = crateBtn.transform.parent;
        LootCrate   lootCrate  = _currentLootCrate.lootCrate;
        List <Item> items      = lootCrate.GenerateItems();

        //NOTE-TO-SELF: DO call this API method! (Instead of one-by-one, batch-calls adds all generated items)
        API.Items.AddMany(items)
        .Then(res => trace("Added " + items.Count + " items server-side..."))
        .Catch(err => traceError("Something went wrong while adding newly generated items to server-side: " + err.Message));

        dataMan.allItemsList.AddRange(items);
    }
    public void Initialize(LootCrate crate, System.Action callback = null, System.Action callbackOnComplete = null, bool fromStory = false)
    {
        this.crate = crate;
        List <Item> items = crate.GenerateItems();

        this.callbackOnComplete = callbackOnComplete;
        noMenuManagerRef        = fromStory;

        Debug.Log("Adding " + items.Count + " items.");

        /*
         * foreach(Item i in items) {
         *  Debug.Log(" --- --- [Item] " + i.Name);
         * }*/

        // NOTE-TO-SELF: DO call this API method! (Instead of one-by-one, batch-calls adds all generated items)
        API.Items.AddMany(items)
        .Catch(err => traceError("Something went wrong while adding newly generated items to server-side: " + err.Message));
        //.Then(res => trace("Added " + items.Count + " items server-side..."))

        DataManager.Instance.allItemsList.AddRange(items);

        if (!fromStory)
        {
            RemoveCrateFromPlayerData(callback);
        }

        // Crate Sequence
        TimelineTween.Create(
            (next) => {
            AudioManager.Instance.Play(SFX_UI.Earthquake);

            //btnGoBack.transform.DOScale(Vector2.zero, 0.5f * speedScale);
            btnGoBack.GetComponent <RectTransform>().DOAnchorPosY(0f, 0.5f * speedScale);

            crateBtn.transform.SetParent(this.transform);

            // Background Shadow here
            backgroundShadow.DOColor(new Color(0f, 0f, 0f, 0.7f), timeScrollerSlides * speedScale);

            crateBtn.transform.TweenMoveByY(50, timeScrollerSlides * speedScale)
            .SetEase(Ease.InOutSine)
            .OnComplete(() => next());
        },

            (next) => {
            // If on crate screen reset the crate list positions

            crateBtn.transform
            .DOShakePosition(timeCrateShake * speedScale, 10, 30, 90, false, false)
            .OnComplete(() => next());
        },

            (next) => {
            AudioManager.Instance.Stop(SFX_UI.Earthquake);
            AudioManager.Instance.Play(SFX_UI.Explosion);

            GameObject itemPrefab = GetPrefab("SubItems/LootCrateItem");

            var canvasSize = GetScreenSize();
            float itemSize = canvasSize.x / 3f;

            for (int i = 0; i < items.Count; i++)
            {
                Item itemData             = items[i];
                GameObject itemGO         = GameObject.Instantiate(itemPrefab);
                LootCrateItem item        = itemGO.GetComponent <LootCrateItem>();
                Button itemBtn            = itemGO.GetComponent <Button>();
                TextMeshProUGUI itemLabel = itemGO.GetComponentInChildren <TextMeshProUGUI>();
                RectTransform itemTrans   = (RectTransform)itemGO.transform;

                itemTrans.SetParent(this.transform);
                itemTrans.localPosition = Vector2.zero;
                itemTrans.SetWidthAndHeight(itemSize);

                item.itemData = itemData;
                item.UpdateIdentifiedIcon();

                _crateItems.Add(item);

                itemBtn.onClick.AddListener(() => BtnOnItemClick(item, fromStory));
            }

            LayoutUpdate();

            TimelineTween.Scatter(0.08f, _crateItems, (item, id) => {
                return(TimelineTween.Pulsate(item.transform, 1.3f, timeItemsExplode * speedScale));
            });

            Color c = crateBtn.GetComponent <Image>().color;
            c.a     = 0;
            crateBtn.GetComponent <Image>().DOColor(c, 0.3f).OnComplete(() => {
                Destroy(crateBtn.gameObject);
            });

            /*CanvasGroup cg = crateBtn.GetComponent<CanvasGroup>();
             * cg.DOFade(0, 0.3f)
             *  .OnComplete(() => {
             *      Destroy(crateBtn.gameObject);
             *  });*/

            crateBtn.transform
            .DOScale(2.0f, timeCrateExplode * speedScale)
            .SetEase(Ease.OutQuint);

            this.Wait(timeItemsExplode * 2.0f * speedScale, next);
        },

            (next) => {
            TimelineTween.Scatter(0.1f, _crateItems, (item, id) => {
                return(item.filler.DOFade(0, 1 * speedScale));
            });

            this.Wait(timeItemsFormCircle * 1.0f * speedScale, next);
        }
            );
    }