using System;
using System.Collections.Generic;
using AIRuntime.Runtime.Providers.Models;

using Newtonsoft.Json.Linq;


namespace AIRuntime.Runtime.Capabilities
{
    public sealed class CapabilitySchemaExporter
    {
        public JObject Export(
            ICapability capability)
        {
            if (capability == null)
            {
                throw new ArgumentNullException(
                    nameof(capability));
            }


            JObject parameters =
                capability.Parameters;


            if (parameters == null)
            {
                throw new InvalidOperationException(
                    $"Capability '{capability.Name}' returned no parameter schema.");
            }


            return (JObject)parameters.DeepClone();
        }


        public IReadOnlyList<ProviderTool> ExportProviderTools(
            IReadOnlyList<CapabilityDescriptor> capabilities)
        {
            if (capabilities == null)
            {
                throw new ArgumentNullException(
                    nameof(capabilities));
            }


            List<ProviderTool> tools =
                new List<ProviderTool>(
                    capabilities.Count);


            foreach (
                CapabilityDescriptor capability
                in capabilities)
            {
                tools.Add(
                    new ProviderTool
                    {
                        Type =
                            "function",

                        Function =
                            new ProviderToolFunction
                            {
                                Name =
                                    capability.Name,

                                Description =
                                    capability.Description,

                                Parameters =
                                    capability.Schema
                            }
                    });
            }


            return tools;
        }


        public JArray ExportOpenAITools(
            IReadOnlyList<CapabilityDescriptor> capabilities)
        {
            if (capabilities == null)
            {
                throw new ArgumentNullException(
                    nameof(capabilities));
            }


            JArray tools =
                new JArray();


            foreach (
                CapabilityDescriptor capability
                in capabilities)
            {
                JObject function =
                    new JObject
                    {
                        ["name"] =
                            capability.Name,

                        ["description"] =
                            capability.Description,

                        ["parameters"] =
                            JObject.FromObject(
                                capability.Schema)
                    };


                JObject tool =
                    new JObject
                    {
                        ["type"] =
                            "function",

                        ["function"] =
                            function
                    };


                tools.Add(
                    tool);
            }


            return tools;
        }


    }
}
