public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagMode = TagMode.StartTagAndEndTag;
            output.TagName = null;

            if (string.IsNullOrEmpty(Id))
            {
                throw new ArgumentException("id can't be null");
            }

            if (Id.ToLower() == "submit")
            {
                throw new ArgumentException("id can't be named submit");
            }

            Language ??= ViewContext.HttpContext.Features.Get <IRequestCultureFeature>()?.RequestCulture.UICulture.TwoLetterISOLanguageName;

            var settings = ViewContext.HttpContext.RequestServices.GetRequiredService <IOptions <ReCaptchaSettings> >().Value;

            var content = settings.Version switch
            {
                ReCaptchaVersion.V2Invisible => ReCaptchaGenerator.ReCaptchaV2Invisible(settings.SiteKey, Text, ClassName, Language, Callback, Badge),
                ReCaptchaVersion.V3 => ReCaptchaGenerator.ReCaptchaV3(settings.SiteKey, Action, Language, Callback),
                _ => ReCaptchaGenerator.ReCaptchaV2(settings.SiteKey, Size, Theme, Language, Callback, ErrorCallback, ExpiredCallback),
            };

            output.Content.AppendHtml(content);
        }
        /// <summary>
        /// Helper extension to render the Google ReCaptcha v2/v3.
        /// </summary>
        /// <param name="helper">Html helper object.</param>
        /// <param name="text">Text shown in on the button. Used in v2-invisible ReCaptcha.</param>
        /// <param name="className">Custom class names added to the generated button of the v2-invisible ReCaptcha.</param>
        /// <param name="size">Optional parameter, contains the size of the widget.</param>
        /// <param name="theme">Google Recaptcha theme default is light.</param>
        /// <param name="action">Google Recaptcha v3 <a href="https://developers.google.com/recaptcha/docs/v3#actions">Action</a></param>
        /// <param name="language">Google Recaptcha <a href="https://developers.google.com/recaptcha/docs/language">Language Code</a></param>
        /// <param name="id">Google ReCaptcha button id. This id can't be named 'submit' due to a naming bug. Used in v2-invisible ReCaptcha.</param>
        /// <param name="badge">Badge parameter for the v2 invisible widget. Defaults to bottomright.</param>
        /// <param name="callback">Google ReCaptcha success callback method. Used in v2 ReCaptcha.</param>
        /// <param name="errorCallback">Google ReCaptcha error callback method. Used in v2 ReCaptcha.</param>
        /// <param name="expiredCallback">Google ReCaptcha expired callback method. Used in v2 ReCaptcha.</param>
        /// <returns>HtmlString with Recaptcha elements</returns>
        public static IHtmlContent ReCaptcha(
            this IHtmlHelper helper,
            string text            = "Submit",
            string className       = "",
            string size            = "normal",
            string theme           = "light",
            string action          = "homepage",
            string language        = null,
            string id              = "recaptcha",
            string badge           = "bottomright",
            string callback        = null,
            string errorCallback   = null,
            string expiredCallback = null)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException("id can't be null");
            }

            if (id.ToLower() == "submit")
            {
                throw new ArgumentException("id can't be named submit");
            }

            language ??= helper.ViewContext.HttpContext.Features.Get <IRequestCultureFeature>()?.RequestCulture
            .UICulture.TwoLetterISOLanguageName;

            var settings = helper.ViewContext.HttpContext.RequestServices.GetRequiredService <IOptions <ReCaptchaSettings> >().Value;

            switch (settings.Version)
            {
            default:
            case ReCaptchaVersion.V2:
                return(ReCaptchaGenerator.ReCaptchaV2(settings.SiteKey, size, theme, language, callback, errorCallback, expiredCallback));

            case ReCaptchaVersion.V2Invisible:
                return(ReCaptchaGenerator.ReCaptchaV2Invisible(settings.SiteKey, text, className, language, callback, badge));

            case ReCaptchaVersion.V3:
                return(ReCaptchaGenerator.ReCaptchaV3(settings.SiteKey, action, language, callback));
            }
        }