Try your search with a different keyword or use * as a wildcard.
using System.Net;
using System.Text;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Orders;
using Nop.Services.Attributes;
using Nop.Services.Catalog;
using Nop.Services.Directory;
using Nop.Services.Html;
using Nop.Services.Localization;
using Nop.Services.Media;
using Nop.Services.Tax;
namespace Nop.Services.Orders;
/// 
/// Checkout attribute helper
///  
public partial class CheckoutAttributeFormatter : ICheckoutAttributeFormatter
{
    #region Fields
    protected readonly IAttributeParser _checkoutAttributeParser;
    protected readonly IAttributeService _checkoutAttributeService;
    protected readonly ICurrencyService _currencyService;
    protected readonly IDownloadService _downloadService;
    protected readonly IHtmlFormatter _htmlFormatter;
    protected readonly ILocalizationService _localizationService;
    protected readonly IPriceFormatter _priceFormatter;
    protected readonly ITaxService _taxService;
    protected readonly IWebHelper _webHelper;
    protected readonly IWorkContext _workContext;
    #endregion
    #region Ctor
    public CheckoutAttributeFormatter(IAttributeParser checkoutAttributeParser,
        IAttributeService checkoutAttributeService,
        ICurrencyService currencyService,
        IDownloadService downloadService,
        IHtmlFormatter htmlFormatter,
        ILocalizationService localizationService,
        IPriceFormatter priceFormatter,
        ITaxService taxService,
        IWebHelper webHelper,
        IWorkContext workContext)
    {
        _checkoutAttributeParser = checkoutAttributeParser;
        _checkoutAttributeService = checkoutAttributeService;
        _currencyService = currencyService;
        _downloadService = downloadService;
        _htmlFormatter = htmlFormatter;
        _localizationService = localizationService;
        _priceFormatter = priceFormatter;
        _taxService = taxService;
        _webHelper = webHelper;
        _workContext = workContext;
    }
    #endregion
    #region Methods
    /// 
    /// Formats attributes
    ///  
    /// Attributes in XML format
    /// Customer
    /// Separator
    /// A value indicating whether to encode (HTML) values
    /// A value indicating whether to render prices
    /// A value indicating whether to HTML hyperlink tags could be rendered (if required)
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the attributes
    ///  
    public virtual async Task FormatAttributesAsync(string attributesXml,
        Customer customer,
        string separator = "
",
        bool htmlEncode = true,
        bool renderPrices = true,
        bool allowHyperlinks = true)
    {
        var result = new StringBuilder();
        var currentLanguage = await _workContext.GetWorkingLanguageAsync();
        var attributes = await _checkoutAttributeParser.ParseAttributesAsync(attributesXml);
        for (var i = 0; i < attributes.Count; i++)
        {
            var attribute = attributes[i];
            var valuesStr = _checkoutAttributeParser.ParseValues(attributesXml, attribute.Id);
            for (var j = 0; j < valuesStr.Count; j++)
            {
                var valueStr = valuesStr[j];
                var formattedAttribute = string.Empty;
                if (!attribute.ShouldHaveValues)
                {
                    //no values
                    if (attribute.AttributeControlType == AttributeControlType.MultilineTextbox)
                    {
                        //multiline textbox
                        var attributeName = await _localizationService.GetLocalizedAsync(attribute, a => a.Name, currentLanguage.Id);
                        //encode (if required)
                        if (htmlEncode)
                            attributeName = WebUtility.HtmlEncode(attributeName);
                        formattedAttribute = $"{attributeName}: {_htmlFormatter.FormatText(valueStr, false, true, false, false, false, false)}";
                        //we never encode multiline textbox input
                    }
                    else if (attribute.AttributeControlType == AttributeControlType.FileUpload)
                    {
                        //file upload
                        _ = Guid.TryParse(valueStr, out var downloadGuid);
                        var download = await _downloadService.GetDownloadByGuidAsync(downloadGuid);
                        if (download != null)
                        {
                            string attributeText;
                            var fileName = $"{download.Filename ?? download.DownloadGuid.ToString()}{download.Extension}";
                            //encode (if required)
                            if (htmlEncode)
                                fileName = WebUtility.HtmlEncode(fileName);
                            if (allowHyperlinks)
                            {
                                //hyperlinks are allowed
                                var downloadLink = $"{_webHelper.GetStoreLocation()}download/getfileupload/?downloadId={download.DownloadGuid}";
                                attributeText = $"{fileName}";
                            }
                            else
                            {
                                //hyperlinks aren't allowed
                                attributeText = fileName;
                            }
                            var attributeName = await _localizationService.GetLocalizedAsync(attribute, a => a.Name, currentLanguage.Id);
                            //encode (if required)
                            if (htmlEncode)
                                attributeName = WebUtility.HtmlEncode(attributeName);
                            formattedAttribute = $"{attributeName}: {attributeText}";
                        }
                    }
                    else
                    {
                        //other attributes (textbox, datepicker)
                        formattedAttribute = $"{await _localizationService.GetLocalizedAsync(attribute, a => a.Name, currentLanguage.Id)}: {valueStr}";
                        //encode (if required)
                        if (htmlEncode)
                            formattedAttribute = WebUtility.HtmlEncode(formattedAttribute);
                    }
                }
                else
                {
                    if (int.TryParse(valueStr, out var attributeValueId))
                    {
                        var attributeValue = await _checkoutAttributeService.GetAttributeValueByIdAsync(attributeValueId);
                        if (attributeValue != null)
                        {
                            formattedAttribute = $"{await _localizationService.GetLocalizedAsync(attribute, a => a.Name, currentLanguage.Id)}: {await _localizationService.GetLocalizedAsync(attributeValue, a => a.Name, currentLanguage.Id)}";
                            if (renderPrices)
                            {
                                var priceAdjustmentBase = (await _taxService.GetCheckoutAttributePriceAsync(attribute, attributeValue, customer)).price;
                                var priceAdjustment = await _currencyService.ConvertFromPrimaryStoreCurrencyAsync(priceAdjustmentBase, await _workContext.GetWorkingCurrencyAsync());
                                if (priceAdjustmentBase > 0)
                                {
                                    formattedAttribute += string.Format(
                                        await _localizationService.GetResourceAsync("FormattedAttributes.PriceAdjustment"),
                                        "+", await _priceFormatter.FormatPriceAsync(priceAdjustment), string.Empty);
                                }
                            }
                        }
                        //encode (if required)
                        if (htmlEncode)
                            formattedAttribute = WebUtility.HtmlEncode(formattedAttribute);
                    }
                }
                if (string.IsNullOrEmpty(formattedAttribute))
                    continue;
                if (i != 0 || j != 0)
                    result.Append(separator);
                result.Append(formattedAttribute);
            }
        }
        return result.ToString();
    }
    #endregion
}