//
// ARF - Augmented Reality Framework (ETSI ISG ARF)
//
// Copyright 2024 ETSI
//
// 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.
//
// Last change: March 2024
//

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using UnityEngine;

using ETSI.ARF.OpenAPI;
using ETSI.ARF.OpenAPI.WorldStorage;

namespace ETSI.ARF.WorldStorage.REST
{
    public class RequestBase<T> // where T : Trackable, WorldAnchor, WorldLink
    {
        static protected WorldStorageServer wsServer;
        static protected WorldStorageClient apiClient;

        static protected string token = "ARF_Permission";

        // Cache the current list
        static public Dictionary<Guid, object> listOfObjects = new Dictionary<Guid, object>();


        //
        // Helpers
        //
        static protected void OnReceiveObject<TObj>(Task<TObj> t, object id)
        {
            if (t.IsCompleted)
            {
                ResponseObject<TObj> o = (ResponseObject<TObj>)id;
                o.responseTime = DateTime.Now;
                o.result = t.Result;
                Debug.Log($"Server Response = {o.result} (ID={o.transactionId}, Msg={o.message})");

                o.callback?.Invoke(o);
            }
            else Debug.Log("OpenAPI Timeout!");
        }

        static protected void OnReceiveListOfObjects<TObj>(Task<List<TObj>> t, object id) where TObj : IModel
        {
            if (t.IsCompleted)
            {
                ResponseObject<List<TObj>> o = (ResponseObject<List<TObj>>)id;
                o.responseTime = DateTime.Now;
                o.result = t.Result;
                Debug.Log($"[REST] Server Response = Got {o.result.Count} entrie(s) (ID={o.transactionId}, Msg={o.message})");

                listOfObjects.Clear();
                foreach (var i in o.result)
                {
                    listOfObjects.Add(i.UUID, i);
                }
                o.callback?.Invoke(o);
            }
            else Debug.Log("[REST] OpenAPI Timeout!");
        }

    }
}
