using System;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Linq;
using static TagsAndLayers;
using Random = Unity.Mathematics.Random;

public class DiceRoller: MonoBehaviour
{
    private const int NUMBER_OF_WHITE_DICE = 4;
    private const int NUMBER_OF_BLACK_DICE = 1;
    
    private List<int> _rolledWhiteDice = new List<int>();
    private List<int> _rolledBlackDice = new List<int>();
    private System.Random _randomGen = new System.Random();
    [SerializeField] private Button rollDiceButton; 

    public GameObject dice;
    public event EventHandler diceRolled;

    private void Start()
    {
        rollDiceButton.onClick.AddListener(RollDice);
    }

    public void Enable()
    {
        rollDiceButton.interactable = true;
    }

    public void Disable()
    {
        rollDiceButton.interactable = false;
    }

    private void RollDice() {
        _rolledWhiteDice.Clear();
        _rolledBlackDice.Clear();
        for (int i = 0; i < NUMBER_OF_WHITE_DICE; i++) 
        {
            _rolledWhiteDice.Add(_randomGen.Next(1,7));
        }
        for (int i = 0; i < NUMBER_OF_BLACK_DICE; i++)
        {
            _rolledBlackDice.Add(_randomGen.Next(1,7));
        }
        diceRolled?.Invoke(this, EventArgs.Empty);
        UpdateGUI();
    }

    public void ResetDice()
    {
        foreach (Transform dieTransform in dice.transform)
        {
            dieTransform.GetComponent<Die>().ResetDie();
        }
    }

    private void UpdateGUI() {
        // Get dice object from the game objects with the right tag.
        Die[] whiteDice = Helper.GetTaggedChildren(dice, WHITE_DIE_TAG).Select(die => die.GetComponent<Die>())
            .ToArray();
        Die[] blackDice = Helper.GetTaggedChildren(dice, BLACK_DIE_TAG).Select(die => die.GetComponent<Die>())
            .ToArray();
        
        // Set the result of the dice object with the randomly generated number
        for (int i = 0; i < NUMBER_OF_WHITE_DICE; i++)
        {
            whiteDice[i].SetResult(_rolledWhiteDice[i]);
        }
        for (int i = 0; i < NUMBER_OF_BLACK_DICE; i++)
        {
            blackDice[i].SetResult(_rolledBlackDice[i]);
        }
    }
    
}
