﻿using AsmodeeDigital.CrossPromo.Plugin.Domain;
using AsmodeeDigital.CrossPromo.Plugin.Domain.Data;
using AsmodeeDigital.CrossPromo.Plugin.Utils;
using AsmodeeDigital.CrossPromo.Plugin.View;
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace AsmodeeDigital.CrossPromo.Plugin.UI
{
    public class MoreGamesPopup : CrossPromoPopup
    {
        [Serializable]
        public class UIMoreGamesPopup
        {
            public SpriteRenderer PopupShadow;
            //public int PopupShadowSize;
            public SpriteRenderer PopupWindow;
            //public Sprite PopupHeaderBackground;
            public TextMeshProUGUI HeaderText;

            //public Sprite PopupCloseButtonBackground;
            //public Sprite PopupCloseButtonForeground;
            //public Color PopupCloseButtonNormalColor;
            //public Color PopupCloseButtonHighlightedColor;
            //public Color PopupCloseButtonPressedColor;
            //public Color PopupCloseButtonDisabledColor;

            public RectTransform Content;
            public TabToggleTMP TabToggleNew;
            public CanvasScaler CanvasScaler;
            public RectTransform RectTransform;
        }

        public UIMoreGamesPopup uiMoreGamesPopup;

        public bool ActiveTabletMode = true;
        public int SpacingX = 10;
        public int SpacingY = 10;
        public int TileWidth = 200;
        public int TileHeight = 200;
        public TileContainer TilePrefab;

        private List<TileContainer> _tilesUI = new List<TileContainer>();
        private DeviceOrientation _previousOrientation = DeviceOrientation.Unknown;
        private MoreGamesFilters _currentFilter = MoreGamesFilters.Board;

        public void RefreshSkin(CrossPromoSkin skin)
        {
            uiMoreGamesPopup.HeaderText.fontSize = skin.PopupHeaderText.FontSize;
        }

        private void Awake()
        {
            CrossPromoView.Instance.CrossPromoLogic.ReceivingGroupProductEvent += CrossPromoLogic_ReceivingGroupProductEvent;
            DeviceScaler.Instance.DeviceOrientationChangedEvent += Refresh;
        }

        public override void Show()
        {
            base.Show();

            if (uiMoreGamesPopup.TabToggleNew != null)
                uiMoreGamesPopup.TabToggleNew.isOn = true;
        }

        protected virtual void Refresh()
        {
            if (this.gameObject.activeInHierarchy)
                CrossPromoView.Instance.CrossPromoLogic.MoreGameRequest(_currentFilter);
        }

        private void CrossPromoLogic_ReceivingGroupProductEvent(GroupProduct groupProduct)
        {
            if (this.gameObject.activeInHierarchy)
                ShowGroupOfProducts(groupProduct);
        }

        private void ShowGroupOfProducts(GroupProduct groupProduct)
        {
            uiMoreGamesPopup.Content.localPosition = Vector3.zero;
            uiMoreGamesPopup.Content.sizeDelta = new Vector2(0, 0);

            _tilesUI.ForEach(t => t.gameObject.SetActive(false));

            int nbColumns = ActiveTabletMode ? CrossPromoView.Instance.NbColumns : 3;

            TileWidth = (int)((uiMoreGamesPopup.Content.rect.width - (nbColumns - 1) * SpacingX) / (float)nbColumns);

            TileHeight = TileWidth;

            int gridWidth = nbColumns;
            int gridHeight = 100;

            bool[,] cells = new bool[gridWidth, gridHeight];

            foreach (Product product in groupProduct.products)
            {
                bool found = false;
                int x = 0;
                int y = 0;

                for (y = 0; y < gridHeight && !found; y++)
                {
                    for (x = 0; x < gridWidth && !found; x++)
                    {
                        bool canContinue = true;

                        for (int xTile = 0; xTile < product.tile.width && canContinue; xTile++)
                        {
                            for (int yTile = 0; yTile < product.tile.height && canContinue; yTile++)
                            {
                                if (x + xTile > gridWidth - 1 || y + yTile > gridHeight - 1 || cells[x + xTile, y + yTile])
                                    canContinue = false;
                            }
                        }

                        if (canContinue)
                            found = true;
                    }
                }

                if (found)
                {
                    x--; y--;

                    for (int xTile = 0; xTile < product.tile.width; xTile++)
                    {
                        for (int yTile = 0; yTile < product.tile.height; yTile++)
                        {
                            cells[x + xTile, y + yTile] = true;
                        }
                    }

                    TileContainer tileUI = _tilesUI.Find(t => !t.gameObject.activeSelf);

                    if (tileUI == null)
                    {
                        tileUI = Instantiate<TileContainer>(TilePrefab);
                        tileUI.transform.SetParent(uiMoreGamesPopup.Content);

                        _tilesUI.Add(tileUI);
                    }

                    Rect rectTile = tileUI.Init(product, x, y, TileWidth, TileHeight, SpacingX, SpacingY);

                    uiMoreGamesPopup.Content.sizeDelta = new Vector2(0, Math.Max(rectTile.y + rectTile.height + 10, uiMoreGamesPopup.Content.sizeDelta.y));
                }
            }
        }


        public void ShowNew(bool isOn)
        {
            if (!isOn)
                return;

            _currentFilter = MoreGamesFilters.New;
            Refresh();
        }

        public void ShowGamer(bool isOn)
        {
            if (!isOn)
                return;

            _currentFilter = MoreGamesFilters.Gamer;
            Refresh();
        }

        public void ShowFamily(bool isOn)
        {
            if (!isOn)
                return;

            _currentFilter = MoreGamesFilters.Family;
            Refresh();
        }

        public void ShowBoard(bool isOn)
        {
            if (!isOn)
                return;

            _currentFilter = MoreGamesFilters.Board;
            Refresh();
        }
    }
}
