using System;
using System.Collections.Generic;
using Telerik.Sitefinity.Model;
using Telerik.Sitefinity.ModuleEditor.Web.Services.Model;
using Telerik.Sitefinity.Modules.News.Web.UI;
using Telerik.Sitefinity.News.Model;
using Telerik.Sitefinity.Services;
using Telerik.Sitefinity.Utilities.TypeConverters;
using Telerik.Sitefinity.Web.UI.Fields;

namespace SitefinityWebApp
{
    public class AddRelatedDataField
    {
        public void AddField(string contentTypeFullName, string fieldName)
        {
            Type contentType = TypeResolutionService.ResolveType(contentTypeFullName);
            var customFieldContext = new CustomFieldsContext(contentType);
            UserFriendlyDataType userFriendlyDataType = UserFriendlyDataType.RelatedData;
            var field = new WcfField()
            {
                Name = fieldName,
                ContentType = contentTypeFullName,
                FieldTypeKey = userFriendlyDataType.ToString(),
                IsCustom = true,

                //Field definition
                Definition = new WcfFieldDefinition()
                {
                    Title = fieldName,
                    FieldName = fieldName,
                    FieldType = typeof(RelatedDataField).FullName,
                    AllowMultipleSelection = true,
                    FrontendWidgetTypeName = typeof(NewsView).FullName, //For Example: news view added for a frontend widget
                    RelatedDataProvider = string.Empty,
                    RelatedDataType = typeof(NewsItem).FullName //For Example: news item added as related data type
                }
            };
            Dictionary<string, WcfField> relatedDataFields = new Dictionary<string, WcfField>();
            relatedDataFields.Add(fieldName, field);

            customFieldContext.AddOrUpdateCustomFields(relatedDataFields, contentType.Name);
            customFieldContext.SaveChanges();

            //The soft restart of Sitefinity CMS is needed in order to add the recently added custom fields to OA context
            // SystemManager.RestartApplication(false); -- This is obsolete

            // This is from the documentation: https://docs.sitefinity.com/for-developers-application-restart
            //  SystemManager.RestartApplication("Restart invoked through the Sitefinity CMS API", SystemRestartFlags.Default, true);

        }
    }
}