﻿using BaSys40.API.AssetAdministrationShell;
using BaSys40.API.AssetAdministrationShell.Connectables;
using BaSys40.API.Platform;
using BaSys40.API.ServiceProvider;
using BaSys40.Models.Core.AssetAdministrationShell.Generics;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using NLog.Web;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace BaSys40.RI.AAS.SmartControl.Extensions
{
    public static class SmartControlExtensions
    {
        private static SmartControlSettings Settings;
        private static Logger logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
        private static IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider;
        private static SmartControlHandler smartControlHandler;

        static SmartControlExtensions()
        {
            string settingsPath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), SmartControlSettings.FileName);
            Settings = SmartControlSettings.LoadSettings(settingsPath);
        }
        public static IServiceCollection ConfigureSmartControl(this IServiceCollection services, IAssetAdministrationShellServiceProvider aasServiceProvider, SmartControlSettings settings = null)
        {
            Settings = settings ?? Settings;
            assetAdministrationShellServiceProvider = aasServiceProvider;
            smartControlHandler = new SmartControlHandler(Settings.CallbackEndpointUrl);

            var aas_Deleted = SmartControl.Instance.DeleteAssetAdministrationShell(aasServiceProvider.AssetAdministrationShell.IdShort);
            logger.Info($"AAS {aasServiceProvider.AssetAdministrationShell.IdShort} deleted - Success: " + aas_Deleted.Success);
            var aas_Created = SmartControl.Instance.CreateAssetAdministrationShell(aasServiceProvider.AssetAdministrationShell);
            logger.Info($"AAS {aasServiceProvider.AssetAdministrationShell.IdShort} created - Success: " + aas_Created.Success);

            var connectedAAS = new ConnectedAssetAdministrationShell(SmartControl.Instance);
            connectedAAS.BindTo(aasServiceProvider.AssetAdministrationShell);

            foreach (var submodel in aasServiceProvider.AssetAdministrationShell.Submodels)
            {
                var success = connectedAAS.CreateSubmodel(submodel);
                logger.Info($"Submodel {submodel.IdShort} created - Success: " + success);
                var connectedSubmodel = new ConnectedSubmodel(SmartControl.Instance, aasServiceProvider.AssetAdministrationShell);
                connectedSubmodel.BindTo(submodel);
                connectedAAS.RegisterSubmodelServiceProvider(submodel.IdShort, connectedSubmodel);

                foreach (var op in connectedSubmodel.RetrieveOperations().Entity)
                {
                    var connectedOp = new ConnectedOperation(SmartControl.Instance, aasServiceProvider.AssetAdministrationShell, submodel, op);
                    smartControlHandler.RegisterMethodCalledEventHandler(connectedSubmodel, connectedOp, GenericMethodHandler);
                }

                foreach (var de in connectedSubmodel.RetrieveDataElements().Entity)
                {
                    var connectedDataElement = new ConnectedDataElement(SmartControl.Instance, aasServiceProvider.AssetAdministrationShell, submodel, de);
                    smartControlHandler.RegisterGetPropertyValueHandler(connectedSubmodel, connectedDataElement, GenericGetValueHandler);
                    smartControlHandler.RegisterSetPropertyValueHandler(connectedSubmodel, connectedDataElement, GenericSetValueHandler);

                    assetAdministrationShellServiceProvider.GetSubmodelServiceProvider(submodel.IdShort).SubscribeUpdates(de.IdShort, value =>
                    {
                        SmartControl.Instance.UpdateDataElementValue(aasServiceProvider.AssetAdministrationShell.IdShort, submodel.IdShort, de.IdShort, value);
                    });
                }
            }

            services.AddSingleton<IAssetAdministrationShellAggregator, SmartControl>(sp => { return SmartControl.Instance; });
            services.AddSingleton<IAssetAdministrationShellServiceProvider, ConnectedAssetAdministrationShell>(sp => { return connectedAAS; });

            return services;
        }

        private static void GenericSetValueHandler(IConnectableDataElement dataElement, IValue value)
        {
            var handler = assetAdministrationShellServiceProvider.GetSubmodelServiceProvider(dataElement.Submodel.IdShort)
                .RetrieveDataElementHandler(dataElement.DataElement.IdShort);

            handler?.SetHandler?.Invoke(dataElement.DataElement, value);
        }

        private static IValue GenericGetValueHandler(IConnectableDataElement dataElement)
        {
            var handler = assetAdministrationShellServiceProvider.GetSubmodelServiceProvider(dataElement.Submodel.IdShort)
                 .RetrieveDataElementHandler(dataElement.DataElement.IdShort);

            return handler?.GetHandler?.Invoke(dataElement.DataElement);
        }

        private static OperationResult GenericMethodHandler(IConnectableOperation operation, List<IArgument> inputArguments, List<IArgument> outputArguments)
        {
            var del = assetAdministrationShellServiceProvider.GetSubmodelServiceProvider(operation.Submodel.IdShort)
                 .RetrieveMethodDelegate(operation.Operation.IdShort);

            if (del is MethodCalledHandler mch)
                return mch.Invoke(operation.Operation, inputArguments, outputArguments);
            else
            {
                if (inputArguments == null || inputArguments.Count == 0)
                    del.DynamicInvoke();
                else
                {
                    object[] args = new object[inputArguments.Count];
                    for (int i = 0; i < args.Length; i++)
                    {
                        args[i] = inputArguments[i].Value;
                    }
                    del.DynamicInvoke(args);
                }
            }

            return new OperationResult(true);
        }

        public static void Shutdown()
        {
            if(!string.IsNullOrEmpty(assetAdministrationShellServiceProvider?.AssetAdministrationShell?.IdShort))
                SmartControl.Instance.DeleteAssetAdministrationShell(assetAdministrationShellServiceProvider.AssetAdministrationShell.IdShort);

            smartControlHandler.Dispose();
        }
    }
}
