namespace Hcs.Broker.Api.Request
{
    internal static class RequestHelper
    {
        /// <summary>
        /// Подготовка заголовка сообщения отправляемого в ГИС ЖКХ с обязательными атрибутами.
        /// Заголовки могут быть разного типа для разных типов сообщений, но имена полей одинаковые.
        /// </summary>
        internal static THeader CreateHeader<THeader>(Client client) where THeader : class
        {
            try
            {
                var instance = Activator.CreateInstance(typeof(THeader));
                foreach (var prop in instance.GetType().GetProperties())
                {
                    switch (prop.Name)
                    {
                        case "Item":
                            prop.SetValue(instance, client.OrgPPAGUID);
                            break;

                        case "ItemElementName":
                            prop.SetValue(instance, Enum.Parse(prop.PropertyType, "orgPPAGUID"));
                            break;

                        case "MessageGUID":
                            prop.SetValue(instance, Guid.NewGuid().ToString());
                            break;

                        case "Date":
                            prop.SetValue(instance, DateTime.Now);
                            break;

                        case "IsOperatorSignatureSpecified":
                            if (client.Role == OrganizationRole.RC || client.Role == OrganizationRole.RSO)
                            {
                                prop.SetValue(instance, true);
                            }
                            break;

                        case "IsOperatorSignature":
                            if (client.Role == OrganizationRole.RC || client.Role == OrganizationRole.RSO)
                            {
                                prop.SetValue(instance, true);
                            }
                            break;
                    }
                }

                return instance as THeader;
            }
            catch (ArgumentNullException e)
            {
                throw new ApplicationException($"Error occured while building request header: {e.Message}");
            }
            catch (SystemException e)
            {
                throw new ApplicationException($"Error occured while building request header: {e.GetBaseException().Message}");
            }
        }

        /// <summary>
        /// Для объекта запроса возвращает значение строки свойства version
        /// </summary>
        internal static string GetRequestVersionString(object requestObject)
        {
            if (requestObject == null)
            {
                return null;
            }

            var versionHost = requestObject;
            if (versionHost != null)
            {
                var versionProperty = versionHost.GetType().GetProperties().FirstOrDefault(x => x.Name == "version");
                if (versionProperty != null)
                {
                    return versionProperty.GetValue(versionHost) as string;
                }
            }

            foreach (var field in requestObject.GetType().GetFields())
            {
                versionHost = field.GetValue(requestObject);
                if (versionHost != null)
                {
                    var versionProperty = versionHost.GetType().GetProperties().FirstOrDefault(x => x.Name == "version");
                    if (versionProperty != null)
                    {
                        return versionProperty.GetValue(versionHost) as string;
                    }
                }
            }

            return null;
        }
    }
}
