﻿/*
 * 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 != 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
                }
            }
        }
    }
}
