﻿using System;
using System.Text;
using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Games.RpgMaterial.Service;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Service;
using UnityEngine;
using UnityEngine.UI;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.UI.GM
{
    public class GmPanelMaterialHistory : MonoBehaviour
    {
        [SerializeField] private Text m_MaterialHistory;
        private readonly StringBuilder m_SbHistory = new StringBuilder();

        private void OnEnable()
        {
            var all = ServiceRegister.RegisteredMaterialTypes;
            for (var i = 0; i < all.Length; i++)
            {
                var service = ServiceCenter.GetMaterialService(all[i]);
                service.AddEventListener(MaterialServiceEvents.OnNotifyUpdate, OnMaterialUpdate);
            }
        }

        private void OnDisable()
        {
            var all = ServiceRegister.RegisteredMaterialTypes;
            for (var i = all.Length - 1; i >= 0; i--)
            {
                var service = ServiceCenter.GetMaterialService(all[i]);
                service.RemoveEventListener(MaterialServiceEvents.OnNotifyUpdate, OnMaterialUpdate);
            }
        }

        private void OnMaterialUpdate(EventData evd)
        {
            var result = (MaterialServiceEventData) evd.Data;
            if (null == result || !result.Succ) return;
            m_SbHistory.Insert(0, GenHistoryItem(result, result.Notify));
            m_MaterialHistory.text = m_SbHistory.ToString();
        }

        private string GenHistoryItem(MaterialServiceEventData result, UserNotifyData notify)
        {
            var n = ServiceCenter.GetMaterialService(notify.Type).GetGameMaterial(notify.Id).Name;
            var timeStr = DateTime.Now.ToString("HH:mm:ss");
            return $"{timeStr}: Type={notify.Type}, Id={notify.Id}, Nane={n}, Offset={notify.Offset} [{result.Status}]\n";
        }

        public void OnClickClearHistory()
        {
            m_SbHistory.Clear();
            m_MaterialHistory.text = "";
        }
    }
}