using System;
using System.Threading.Tasks;
using Aurora.Proto.Sync;
using Aurora.Proto.General;
using Aurora.Services.PlayerService;

namespace Aurora.RemoteImpl
{
    public class RemoteSyncServiceImpl : RemoteSyncService.RemoteSyncServiceBase
    {
        /// <summary>
        /// RPC for getting a stream of media syncs
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseStream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task GetMediaSync(Empty request,
            Grpc.Core.IServerStreamWriter<Sync> responseStream,
            Grpc.Core.ServerCallContext context)
        {
            bool continueSync = true;
            string currentId = PlayerService.Instance.CurrentMedia.Id;
            MediaChangedEventHandler mediaChanged = (sender, e) =>
            {
                if (e.NewId != currentId)
                {
                    continueSync = false;
                }
            };

            PlayerService.Instance.MediaChanged += mediaChanged;

            while (continueSync)
            {
                float length = PlayerService.Instance.CurrentMediaLength;

                Sync sync = new Sync()
                {
                    TrackPosition = PlayerService.Instance.CurrentMediaPosition,
                    ServerTimeTicks = Utils.TimeUtils.GetNetworkTime().DateTime.Ticks
                };
                await responseStream.WriteAsync(sync);
                Console.WriteLine("Sent Sync");
                await Task.Delay(5000);
            }
        }
    }
}