﻿#region License

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using Gremlin.Net.Driver.Messages;
using Gremlin.Net.Process;
using Gremlin.Net.Process.Traversal;

namespace Gremlin.Net.Driver.Remote
{
    #pragma warning disable 612,618
    internal class DriverRemoteTraversalSideEffects : ITraversalSideEffects
    {
        private readonly IGremlinClient _gremlinClient;
        private readonly List<string> _keys = new List<string>();
        private readonly Guid _serverSideEffectId;
        private readonly Dictionary<string, object> _sideEffects = new Dictionary<string, object>();
        private bool _closed;
        private bool _retrievedAllKeys;

        public DriverRemoteTraversalSideEffects(IGremlinClient gremlinClient, Guid serverSideEffectId)
        {
            _gremlinClient = gremlinClient;
            _serverSideEffectId = serverSideEffectId;
        }

        public void Dispose()
        {
            Close();
        }

        public IReadOnlyCollection<string> Keys()
        {
            if (_closed && !_retrievedAllKeys)
                throw new InvalidOperationException("Traversal has been closed - side-effect keys cannot be retrieved");
            if (!_retrievedAllKeys)
            {
                _keys.AddRange(RetrieveKeys());
                _retrievedAllKeys = true;
            }
            return _keys;
        }

        private IEnumerable<string> RetrieveKeys()
        {
            return _gremlinClient.SubmitAsync<string>(SideEffectKeysMessage()).Result;
        }

        private RequestMessage SideEffectKeysMessage()
        {
            return RequestMessage.Build(Tokens.OpsKeys)
                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
                .Processor(Tokens.ProcessorTraversal)
                .Create();
        }

        public object Get(string key)
        {
            if (!Keys().Contains(key))
                throw new KeyNotFoundException($"Side effect key {key} does not exist");
            if (!_sideEffects.ContainsKey(key))
            {
                if (_closed)
                    throw new InvalidOperationException(
                        "Traversal has been closed - no new side-effects can be retrieved");
                _sideEffects.Add(key, RetrieveSideEffectsForKey(key));
            }
            return _sideEffects[key];
        }

        private object RetrieveSideEffectsForKey(string key)
        {
            return _gremlinClient.SubmitAsync<object>(SideEffectGatherMessage(key)).Result;
        }

        private RequestMessage SideEffectGatherMessage(string key)
        {
            return RequestMessage.Build(Tokens.OpsGather)
                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
                .AddArgument(Tokens.ArgsSideEffectKey, key)
                .AddArgument(Tokens.ArgsAliases, new Dictionary<string, string> {{"g", "g"}})
                .Processor(Tokens.ProcessorTraversal)
                .Create();
        }

        public void Close()
        {
            if (_closed) return;
            CloseSideEffects();
            _closed = true;
        }

        private void CloseSideEffects()
        {
            _gremlinClient.SubmitAsync<object>(SideEffectCloseMessage()).WaitUnwrap();
        }

        private RequestMessage SideEffectCloseMessage()
        {
            return RequestMessage.Build(Tokens.OpsClose)
                .AddArgument(Tokens.ArgsSideEffect, _serverSideEffectId)
                .Processor(Tokens.ProcessorTraversal)
                .Create();
        }
    }
    #pragma warning disable 612,618
}