﻿using AsmodeeDigital.PlayReal.Plugin.Domain.Players;
using AsmodeeDigital.PlayReal.Plugin.Utils;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace AsmodeeDigital.PlayReal.Samples.UI.Game
{
    /// <summary>
    /// User frame with player's informations (Name, avatar, is online)
    /// </summary>
    public class UserItem : MonoBehaviour
    {
        /// <summary>
        /// UI references of UserItem
        /// </summary>
        [Serializable]
        public class UI
        {
            public Animator AnimatorFrame;
            public Image BackgroundCurrentPlayer;
            public Image AvatarImage;
            public Text UserName;
            public Image ConnectivityState;
            public Text Sum;
            public List<Animator> AnimatorCrowns;
        }

        /// <summary>
        /// UI instance
        /// </summary>
        public UI ui;

        /// <summary>
        /// DoW Id of the player (www_id)
        /// </summary>
        public int PlayerDowId = -1;

        /// <summary>
        /// Local id of the player int the current game
        /// </summary>
        public int PlayerLocalId = -1;

        /// <summary>
        /// Initialize the UI component. Show the user name and download the avatar
        /// </summary>
        /// <param name="playerSeat"></param>
        /// <param name="isOnline"></param>
        public void Init(IPlayerSeat playerSeat, bool? isOnline)
        {
            this.gameObject.SetActive(true);

            if (playerSeat.DoWPlayer != null)
                PlayerDowId = playerSeat.DoWPlayer.w_w_w_id;

            PlayerLocalId = playerSeat.LocalId;

            AvatarPortraitLoader.LoadPlayerAvatar(playerSeat.DoWPlayer, ui.AvatarImage);

            ui.UserName.text = playerSeat.Name;

            if (ui.ConnectivityState != null)
            {
                ui.ConnectivityState.gameObject.SetActive(isOnline.HasValue);
                ui.ConnectivityState.color = isOnline.HasValue && isOnline.Value ? Color.green : Color.red;
            }

            if (ui.BackgroundCurrentPlayer != null)
                ui.BackgroundCurrentPlayer.gameObject.SetActive(playerSeat is LocalPlayerSeat);
        }

        /// <summary>
        /// Change the color of the frame if it's the current player and set the connectivity state color (red / green)
        /// </summary>
        /// <param name="isCurrentPlayer"></param>
        /// <param name="isOnline"></param>
        public void Refresh(bool isCurrentPlayer, bool? isOnline)
        {
            ui.AnimatorFrame.SetBool("Active", isCurrentPlayer);

            if (ui.ConnectivityState != null)
            {
                ui.ConnectivityState.gameObject.SetActive(isOnline.HasValue);

                if (isOnline.HasValue)
                {
                    if (isOnline.Value)
                        ui.ConnectivityState.color = Color.green;
                    else
                        ui.ConnectivityState.color = Color.red;
                }
            }
        }
    }
}