#nullable enable

using ShrinkCommand;
using ShrinkEventBus;
using ShrinkModFramework;
using ShrinkNetwork;

namespace __ROOT_NAMESPACE__
{
    [ShrinkMod("__MOD_ID__", "__DISPLAY_NAME__", "1.0.0")]
    [ShrinkEventSubscriber(OwnerId = "__MOD_ID__", DefaultBus = "mod:__MOD_ID__")]
    [ShrinkCommandSubscriber]
    [ShrinkNetworkSubscriber]
    public sealed partial class __PROJECT_NAME__Mod : ShrinkModBase
    {
        private readonly RuntimeState _state = new();

        public override void OnConstruct(ShrinkModContext context)
        {
            context.Log("模组已构造。");
        }

        public override void OnRegisterContent(ShrinkModContext context)
        {
            context.RegisterContent("example.items", "example_item", "__DISPLAY_NAME__ Item");
        }

        public override void OnInitialize(ShrinkModContext context)
        {
            context.RegisterNetworkHandler<int>("sync.counter", (_, value) =>
            {
                _state.Counter = value;
                context.Log("收到模组网络计数：" + value);
            });
        }

        [ShrinkSubscribe]
        private void OnExampleEvent(__PROJECT_NAME__Event evt)
        {
            _state.LastEventMessage = evt.Message ?? string.Empty;
            _state.Counter++;
        }

        [ShrinkCommand("__COMMAND_ROOT__ ping", Description = "测试模组命令", Permission = "__MOD_ID__.command.ping")]
        private string Ping()
        {
            return "pong:" + _state.Counter;
        }

        [ShrinkNetworkSubscribe(Permission = "__MOD_ID__.rpc.ping")]
        private __PROJECT_NAME__PingResponse HandlePing(__PROJECT_NAME__PingRequest request)
        {
            return new __PROJECT_NAME__PingResponse
            {
                Message = "pong:" + (request.Message ?? string.Empty),
                Counter = _state.Counter
            };
        }

        private sealed class RuntimeState
        {
            public int Counter { get; set; }
            public string LastEventMessage { get; set; } = string.Empty;
        }
    }
}
