﻿/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace DotPulsar.Internal
{
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;

    public sealed class StateTaskCollection<TState> where TState : notnull
    {
        private readonly object _lock;
        private readonly LinkedList<StateTask<TState>> _awaiters;

        public StateTaskCollection()
        {
            _lock = new object();
            _awaiters = new LinkedList<StateTask<TState>>();
        }

        public Task<TState> CreateTaskFor(TState state, StateChanged changed, CancellationToken cancellationToken)
        {
            LinkedListNode<StateTask<TState>> node;

            lock (_lock)
            {
                node = _awaiters.AddFirst(new StateTask<TState>(state, changed));
            }

            node.Value.CancelableCompletionSource.SetupCancellation(() => TaskWasCanceled(node), cancellationToken);

            return node.Value.CancelableCompletionSource.Task;
        }

        public void CompleteTasksAwaiting(TState state)
        {
            lock (_lock)
            {
                var awaiter = _awaiters.First;

                while (awaiter is not null)
                {
                    var next = awaiter.Next;

                    if (awaiter.Value.IsAwaiting(state))
                    {
                        _awaiters.Remove(awaiter);
                        awaiter.Value.CancelableCompletionSource.SetResult(state);
                        awaiter.Value.CancelableCompletionSource.Dispose();
                    }

                    awaiter = next;
                }
            }
        }

        public void CompleteAllTasks(TState state)
        {
            lock (_lock)
            {
                foreach (var awaiter in _awaiters)
                {
                    awaiter.CancelableCompletionSource.SetResult(state);
                    awaiter.CancelableCompletionSource.Dispose();
                }

                _awaiters.Clear();
            }
        }

        private void TaskWasCanceled(LinkedListNode<StateTask<TState>> node)
        {
            lock (_lock)
            {
                try
                {
                    _awaiters.Remove(node);
                    node.Value.Dispose();
                }
                catch
                {
                    // Ignore
                }
            }
        }
    }
}
