using System.Threading;
using Cysharp.Threading.Tasks;
using RebootKit.Engine.Foundation;
using RebootKit.Engine.Services.Console;

namespace RebootKit.Engine.Services.Game {
    public class GameService : IService {
        private static readonly Logger Logger = new(nameof(GameService));

        private GameModeAsset _gameModeAsset;
        private GameMode _gameMode;
        private bool _running;
        
        public async UniTask OnInit(CancellationToken cancellationToken) {
            await UniTask.Yield(cancellationToken);
        }

        public void Dispose() {
            _running = false;
            _gameMode.Dispose();
        }

        public async UniTask Start(GameModeAsset asset, CancellationToken cancellationToken) {
            _gameMode = asset.Create();
            await _gameMode.Start(cancellationToken);

            Run(cancellationToken).Forget();
        }

        private async UniTask Run(CancellationToken cancellationToken) {
            if (_gameMode == null) {
                Logger.Error("Trying to run game without game mode");
                return;
            }
            
            _running = true;
            while (_running) {
                await UniTask.Yield(PlayerLoopTiming.Update, cancellationToken);
                _gameMode.Tick();
            }
        }
    }
}