private DocumentViewTypeViewModel BuildFieldViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentField field = selected.Fields.Where(f => HtmlHelper.RouteFriendlyName(f.FieldName) == name).FirstOrDefault();

            if (field == null)
                return null;

            model.TypeName = field.FieldName;
            model.Value = field.Value;
            model.ShortDescription = field.ShortDescription;
            model.LongDescription = field.LongDescription;
            model.Summary = field.Summary;

            foreach (DocumentExample item in field.Examples)
            {
                model.ExampleUseage += $"<p>{item.Text}</p>";
            }

            foreach (DocumentException exception in field.Exception)
            {
                model.Exceptions += $"<p>{exception.ExceptionName}<br />{exception.Summary}";
            }

            model.Remarks = field.Remarks;

            return model;
        }
        private DocumentViewTypeViewModel BuildMethodViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentMethod method = selected.Methods.Where(f => HtmlHelper.RouteFriendlyName(f.MethodName) == name).FirstOrDefault();

            if (method == null)
                return null;

            model.TypeName = $"{ReturnUptoParam(method.MethodName)} Method";
            model.Returns = method.Returns;
            model.ShortDescription = method.ShortDescription;
            model.LongDescription = method.LongDescription;
            model.Summary = method.Summary;
            model.ExampleUseage = method.ExampleUseage ?? String.Empty;
            model.Parameters = method.Parameters;

            foreach (DocumentExample item in method.Examples)
            {
                model.ExampleUseage += $"<p>{item.Text}</p>";
            }

            foreach (DocumentException exception in method.Exception)
            {
                model.Exceptions += $"<p>{exception.ExceptionName}<br />{exception.Summary}";
            }

            model.Remarks = method.Remarks;

            return model;
        }
        private DocumentViewTypeViewModel BuildPropertyViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentProperty property = selected.Properties.Where(f => HtmlHelper.RouteFriendlyName(f.PropertyName) == name).FirstOrDefault();

            if (property == null)
                return null;

            model.TypeName = $"{property.PropertyName} Property";
            model.Value = property.Value;
            model.ShortDescription = property.ShortDescription;
            model.LongDescription = property.LongDescription;
            model.Summary = property.Summary;

            foreach (DocumentExample item in property.Examples)
            {
                model.ExampleUseage += $"<p>{item.Text}</p>";
            }

            foreach (DocumentException exception in property.Exception)
            {
                model.Exceptions += $"<p>{exception.ExceptionName}<br />{exception.Summary}";
            }

            model.Remarks = property.Remarks;

            return model;
        }
        private DocumentViewTypeViewModel BuildDocumentViewTypeModel(string className, string classType, string typeName, out Document selected)
        {
            selected = _documentationService.GetDocuments()
                .Where(d => d.DocumentType == DocumentType.Class)
                .ToList().Where(c => HtmlHelper.RouteFriendlyName(c.ClassName) == className)
                .FirstOrDefault();

            if (selected == null)
                return null;

            DocumentData data = (DocumentData)selected.Tag;

            if (data.ReferenceData == null)
            {
                List<Document> documents = _documentationService.GetDocuments()
                    .Where(d => d.DocumentType == DocumentType.Assembly ||
                        d.DocumentType == DocumentType.Custom)
                    .OrderBy(o => o.SortOrder).ThenBy(o => o.Title)
                    .ToList();

                data.ReferenceData = GetAllReferences(selected, data, documents);
            }

            DocumentViewTypeViewModel model = new DocumentViewTypeViewModel(GetModelData(),
                selected.Title, data.ReferenceData);

            model.Assembly = HtmlHelper.RouteFriendlyName(selected.AssemblyName);
            model.Namespace = HtmlHelper.RouteFriendlyName(selected.NameSpaceName);
            model.ClassName = HtmlHelper.RouteFriendlyName(selected.ClassName);

            if (data.SeeAlso != null && data.SeeAlso.Count > 0)
            {
                model.SeeAlso = data.SeeAlso;
            }

            if (data.SeeAlso != null && data.SeeAlso.Count > 0)
                model.SeeAlso = data.SeeAlso;

            model.TranslateStrings = selected.DocumentType != DocumentType.Custom &&
                selected.DocumentType != DocumentType.Document &&
                selected.DocumentType != DocumentType.Assembly;

            switch (classType)
            {
                case "Constructor":
                    return BuildConstructorViewModel(model, selected, typeName);

                case "Method":
                    return BuildMethodViewModel(model, selected, typeName);

                case "Property":
                    return BuildPropertyViewModel(model, selected, typeName);

                case "Field":
                    return BuildFieldViewModel(model, selected, typeName);

                default:
                    throw new InvalidOperationException(SharedPluginFeatures.Constants.InvalidTypeName);
            }
        }
        private DocumentViewTypeViewModel BuildConstructorViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentMethod constructor = selected.Constructors.Where(f => HtmlHelper.RouteFriendlyName(f.MethodName) == name).FirstOrDefault();

            if (constructor == null)
                return null;

            model.TypeName = $"{ReturnUptoParam(constructor.MethodName)} Constructor";
            model.Returns = constructor.Returns;
            model.ShortDescription = constructor.ShortDescription;
            model.LongDescription = constructor.LongDescription;
            model.Summary = constructor.Summary;
            model.ExampleUseage = constructor.ExampleUseage;
            model.Parameters = constructor.Parameters;

            foreach (DocumentExample item in constructor.Examples)
            {
                model.ExampleUseage += $"<p>{item.Text}</p>";
            }

            foreach (DocumentException exception in constructor.Exception)
            {
                model.Exceptions += $"<p>{exception.ExceptionName}<br />{exception.Summary}";
            }

            model.Remarks = constructor.Remarks;

            return model;
        }
        public IActionResult ViewType(string className, string classType, string typeName)
        {
            DocumentViewTypeViewModel model = BuildDocumentViewTypeModel(className, classType, typeName, out Document selected);

            if (model == null)
                return RedirectToAction(nameof(Index));

            return View(model);
        }
        private DocumentViewTypeViewModel BuildFieldViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentField field = selected.Fields.Where(f => HtmlHelper.RouteFriendlyName(f.FieldName) == name).FirstOrDefault();

            if (field == null)
            {
                return(null);
            }

            model.TypeName         = field.FieldName;
            model.Value            = field.Value;
            model.ShortDescription = field.ShortDescription;
            model.LongDescription  = field.LongDescription;
            model.Summary          = field.Summary;

            return(model);
        }
        private DocumentViewTypeViewModel BuildPropertyViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentProperty property = selected.Properties.Where(f => HtmlHelper.RouteFriendlyName(f.PropertyName) == name).FirstOrDefault();

            if (property == null)
            {
                return(null);
            }

            model.TypeName         = $"{property.PropertyName} Property";
            model.Value            = property.Value;
            model.ShortDescription = property.ShortDescription;
            model.LongDescription  = property.LongDescription;
            model.Summary          = property.Summary;

            return(model);
        }
        private DocumentViewTypeViewModel BuildMethodViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentMethod method = selected.Methods.Where(f => HtmlHelper.RouteFriendlyName(f.MethodName) == name).FirstOrDefault();

            if (method == null)
            {
                return(null);
            }

            model.TypeName         = $"{ReturnUptoParam(method.MethodName)} Method";
            model.Returns          = method.Returns;
            model.ShortDescription = method.ShortDescription;
            model.LongDescription  = method.LongDescription;
            model.Summary          = method.Summary;
            model.ExampleUseage    = method.ExampleUseage;
            model.Parameters       = method.Parameters;

            return(model);
        }
        private DocumentViewTypeViewModel BuildConstructorViewModel(DocumentViewTypeViewModel model, Document selected, string name)
        {
            DocumentMethod constructor = selected.Constructors.Where(f => HtmlHelper.RouteFriendlyName(f.MethodName) == name).FirstOrDefault();

            if (constructor == null)
            {
                return(null);
            }

            model.TypeName         = $"{ReturnUptoParam(constructor.MethodName)} Constructor";
            model.Returns          = constructor.Returns;
            model.ShortDescription = constructor.ShortDescription;
            model.LongDescription  = constructor.LongDescription;
            model.Summary          = constructor.Summary;
            model.ExampleUseage    = constructor.ExampleUseage;
            model.Parameters       = constructor.Parameters;

            return(model);
        }