using ladaexpress.vn.Infrastructures.DTO.Models.Seo;
using ladaexpress.vn.Infrastructures.Services;
using Microsoft.Extensions.Configuration;
using System.Text.RegularExpressions;

namespace ladaexpress.vn.Infrastructures.Services.Seo
{
    /// <summary>
    /// Implementation của SEO Service
    /// </summary>
    public class SeoService : ISeoService
    {
        private readonly IConfiguration _configuration;
        private readonly IAppConfigService _appConfigService;
        private readonly IBreadcrumbService _breadcrumbService; // Added
        private readonly string _baseUrl;
        private readonly string _defaultImage;
        private readonly string _siteName;

        public SeoService(IConfiguration configuration, IAppConfigService appConfigService, IBreadcrumbService breadcrumbService) // Modified
        {
            _configuration = configuration;
            _appConfigService = appConfigService;
            _breadcrumbService = breadcrumbService; // Injected

            // Fallback to appsettings if AppConfig not available
            _baseUrl = _configuration["SeoSettings:BaseUrl"] ?? "https://ladaexpress.vn";
            _defaultImage = _configuration["SeoSettings:DefaultImage"] ?? "/images/logo.svg";
            _siteName = _configuration["SeoSettings:SiteName"] ?? "LADA Express";
        }

        public async Task<SeoModel> GetHomePageSeoAsync()
        {
            // Get SEO configs from AppConfig
            var title = await GetConfigValueAsync("SEO.HomePage.Title", "LADA Express - Dịch vụ gửi hàng nhanh chóng, uy tín");
            var description = await GetConfigValueAsync("SEO.HomePage.Description", "LADA Express cung cấp dịch vụ gửi hàng nhanh chóng, uy tín trên toàn quốc. Cam kết giao hàng đúng hẹn, giá cả hợp lý. Liên hệ ngay để được tư vấn!");
            var keywords = await GetConfigValueAsync("SEO.HomePage.Keywords", "gửi hàng, chuyển phát nhanh, vận chuyển, LADA Express, giao hàng");
            var ogTitle = await GetConfigValueAsync("SEO.HomePage.OgTitle", "LADA Express - Dịch vụ gửi hàng hàng đầu Việt Nam");
            var ogDescription = await GetConfigValueAsync("SEO.HomePage.OgDescription", "Dịch vụ gửi hàng nhanh chóng, uy tín. Giao hàng toàn quốc, cam kết đúng hẹn.");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            return new SeoModel
            {
                Title = OptimizeTitle(title),
                Description = OptimizeMetaDescription(description),
                Keywords = keywords,
                CanonicalUrl = CreateCanonicalUrl("/", baseUrl),
                OgTitle = ogTitle,
                OgDescription = OptimizeMetaDescription(ogDescription),
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = "website",
                OgUrl = CreateCanonicalUrl("/", baseUrl),
                TwitterTitle = await GetConfigValueAsync("SEO.HomePage.TwitterTitle", "LADA Express - Gửi hàng nhanh chóng"),
                TwitterDescription = await GetConfigValueAsync("SEO.HomePage.TwitterDescription", "Dịch vụ gửi hàng uy tín, giao hàng toàn quốc"),
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                SitemapPriority = 1.0,
                SitemapChangeFreq = "weekly",
                Breadcrumbs = await _breadcrumbService.GetHomeBreadcrumbsAsync()
            };
        }

        public async Task<SeoModel> GetArticleSeoAsync(int postId, string title, string description, string image, string url,
            string author, DateTime publishedDate, DateTime? modifiedDate = null, List<string>? keywords = null)
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.News.TitleTemplate", "{title} - Tin tức LADA Express");
            var descriptionTemplate = await GetConfigValueAsync("SEO.News.DescriptionTemplate", "{description} Cập nhật tin tức mới nhất từ LADA Express.");
            var defaultKeywords = await GetConfigValueAsync("SEO.News.DefaultKeywords", "tin tức vận chuyển, LADA Express, logistics");
            var ogType = await GetConfigValueAsync("SEO.News.OgType", "article");
            var defaultAuthor = await GetConfigValueAsync("SEO.News.DefaultAuthor", "LADA Express");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            var processedTitle = ProcessTemplate(titleTemplate, new Dictionary<string, string>
            {
                {"title", title},
                {"author", author},
                {"publishedDate", publishedDate.ToString("dd/MM/yyyy")}
            });

            var processedDescription = ProcessTemplate(descriptionTemplate, new Dictionary<string, string>
            {
                {"title", title},
                {"description", description},
                {"author", author},
                {"publishedDate", publishedDate.ToString("dd/MM/yyyy")}
            });

            var optimizedTitle = OptimizeTitle(processedTitle);
            var optimizedDescription = OptimizeMetaDescription(processedDescription);
            var finalKeywords = keywords != null && keywords.Count > 0
    ? string.Join(", ", keywords) + ", " + defaultKeywords
    : defaultKeywords;

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = finalKeywords,
                CanonicalUrl = CreateCanonicalUrl(url, baseUrl),
                OgTitle = title,
                OgDescription = optimizedDescription,
                OgImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(defaultImage, baseUrl) : CreateCanonicalUrl(image, baseUrl),
                OgType = ogType,
                OgUrl = CreateCanonicalUrl(url, baseUrl),
                TwitterTitle = title,
                TwitterDescription = optimizedDescription,
                TwitterImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(defaultImage, baseUrl) : CreateCanonicalUrl(image, baseUrl),
                Author = !string.IsNullOrEmpty(author) ? author : defaultAuthor,
                PublishedDate = publishedDate,
                ModifiedDate = modifiedDate ?? publishedDate,
                SitemapPriority = 0.6,
                SitemapChangeFreq = "monthly",
                Breadcrumbs = await _breadcrumbService.GetPostBreadcrumbsAsync(postId, title, url)
            };
        }

        public async Task<SeoModel> GetProductSeoAsync(int productId, string name, string description, string image, string url, decimal? price = null)
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.Product.TitleTemplate", "{title} - LADA Express");
            var descriptionTemplate = await GetConfigValueAsync("SEO.Product.DescriptionTemplate", "{description} Liên hệ LADA Express để được tư vấn và báo giá tốt nhất.");
            var defaultKeywords = await GetConfigValueAsync("SEO.Product.DefaultKeywords", "dịch vụ vận chuyển, gửi hàng, LADA Express");
            var ogType = await GetConfigValueAsync("SEO.Product.OgType", "product");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            var processedTitle = ProcessTemplate(titleTemplate, new Dictionary<string, string>
            {
                {"title", name},
                {"price", price?.ToString("N0") ?? await GetConfigValueAsync("SEO.Product.DefaultPrice", "Liên hệ")}
            });

            var processedDescription = ProcessTemplate(descriptionTemplate, new Dictionary<string, string>
            {
                {"title", name},
                {"description", description},
                {"price", price?.ToString("N0") ?? await GetConfigValueAsync("SEO.Product.DefaultPrice", "Liên hệ")}
            });

            var optimizedTitle = OptimizeTitle(processedTitle);
            var optimizedDescription = OptimizeMetaDescription(processedDescription);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"{name}, {defaultKeywords}",
                CanonicalUrl = CreateCanonicalUrl(url, baseUrl),
                OgTitle = name,
                OgDescription = optimizedDescription,
                OgImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(defaultImage, baseUrl) : CreateCanonicalUrl(image, baseUrl),
                OgType = ogType,
                OgUrl = CreateCanonicalUrl(url, baseUrl),
                TwitterTitle = name,
                TwitterDescription = optimizedDescription,
                TwitterImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(defaultImage, baseUrl) : CreateCanonicalUrl(image, baseUrl),
                SitemapPriority = 0.8,
                SitemapChangeFreq = "monthly",
                Breadcrumbs = await _breadcrumbService.GetProductBreadcrumbsAsync(productId, name, url)
            };
        }

        public async Task<SeoModel> GetCategorySeoAsync(int categoryId, string name, string description, string url)
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.Category.TitleTemplate", "{name} - Danh mục dịch vụ LADA Express");
            var descriptionTemplate = await GetConfigValueAsync("SEO.Category.DescriptionTemplate", "Khám phá các dịch vụ {name} chất lượng cao tại LADA Express. {description}");
            var defaultKeywords = await GetConfigValueAsync("SEO.Category.DefaultKeywords", "danh mục dịch vụ, LADA Express");
            var ogType = await GetConfigValueAsync("SEO.Category.OgType", "website");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            var processedTitle = ProcessTemplate(titleTemplate, new Dictionary<string, string>
            {
                {"name", name},
                {"description", description}
            });

            var processedDescription = ProcessTemplate(descriptionTemplate, new Dictionary<string, string>
            {
                {"name", name},
                {"description", description}
            });

            var optimizedTitle = OptimizeTitle(processedTitle);
            var optimizedDescription = OptimizeMetaDescription(processedDescription);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"{name}, {defaultKeywords}",
                CanonicalUrl = CreateCanonicalUrl(url, baseUrl),
                OgTitle = name,
                OgDescription = optimizedDescription,
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = ogType,
                OgUrl = CreateCanonicalUrl(url, baseUrl),
                TwitterTitle = name,
                TwitterDescription = optimizedDescription,
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                SitemapPriority = 0.7,
                SitemapChangeFreq = "weekly",
                Breadcrumbs = await _breadcrumbService.GetCategoryBreadcrumbsAsync(categoryId, name, url)
            };
        }

        public async Task<SeoModel> GetJobPostIndexSeoAsync()
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.JobPost.Index", "Tuyển dụng - Việc làm tại LADA Express");
            var descriptionTemplate = await GetConfigValueAsync("SEO.JobPost.Index.Description", "Cơ hội nghề nghiệp tại LADA Express. Tham gia đội ngũ chuyên nghiệp, môi trường làm việc năng động và nhiều cơ hội phát triển.");
            var defaultKeywords = await GetConfigValueAsync("SEO.JobPost.Index.DefaultKeywords", "việc làm, tuyển dụng, cơ hội nghề nghiệp, việc làm lái xe, việc làm vận tải, nhân viên kinh doanh, LADA Express");
            var ogType = await GetConfigValueAsync("SEO.JobPost.Index.OgType", "website");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);



            var optimizedTitle = OptimizeTitle(titleTemplate);
            var optimizedDescription = OptimizeMetaDescription(descriptionTemplate);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"{defaultKeywords}",
                CanonicalUrl = CreateCanonicalUrl("/tuyen-dung", baseUrl),
                OgTitle = titleTemplate,
                OgDescription = optimizedDescription,
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = ogType,
                OgUrl = CreateCanonicalUrl("/tuyen-dung", baseUrl),
                TwitterTitle = titleTemplate,
                TwitterDescription = optimizedDescription,
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                SitemapPriority = 0.7,
                SitemapChangeFreq = "weekly",
                Breadcrumbs = await _breadcrumbService.GetJobPostIndexBreadcrumbsAsync()
            };
        }

        public async Task<SeoModel> GetProductIndexSeoAsync()
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.Product.Index", "Dịch vụ");
            var descriptionTemplate = await GetConfigValueAsync("SEO.Product.Index.Description", "Khám phá các dịch vụ vận chuyển chất lượng cao tại LADA Express.");
            var defaultKeywords = await GetConfigValueAsync("SEO.Product.Index.DefaultKeywords", "dịch vụ, xe tải ghép, vận chuyển, gửi hàng, LADA Express");
            var ogType = await GetConfigValueAsync("SEO.Product.Index.OgType", "website");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            

            

            var optimizedTitle = OptimizeTitle(titleTemplate);
            var optimizedDescription = OptimizeMetaDescription(descriptionTemplate);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"{defaultKeywords}",
                CanonicalUrl = CreateCanonicalUrl("/dich-vu", baseUrl),
                OgTitle = titleTemplate,
                OgDescription = optimizedDescription,
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = ogType,
                OgUrl = CreateCanonicalUrl("/dich-vu", baseUrl),
                TwitterTitle = titleTemplate,
                TwitterDescription = optimizedDescription,
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                SitemapPriority = 0.7,
                SitemapChangeFreq = "weekly",
                Breadcrumbs = await _breadcrumbService.GetProductIndexBreadcrumbsAsync()
            };
        }

        public async Task<SeoModel> GetTagSeoAsync(int tagId, string name, string url)
        {
            // Get templates from AppConfig
            var titleTemplate = await GetConfigValueAsync("SEO.Tag.TitleTemplate", "{name} - Thẻ LADA Express");
            var descriptionTemplate = await GetConfigValueAsync("SEO.Tag.DescriptionTemplate", "Tìm hiểu về {name} và các dịch vụ liên quan tại LADA Express.");
            var defaultKeywords = await GetConfigValueAsync("SEO.Tag.DefaultKeywords", "thẻ, LADA Express");
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            var processedTitle = ProcessTemplate(titleTemplate, new Dictionary<string, string>
            {
                {"name", name}
            });

            var processedDescription = ProcessTemplate(descriptionTemplate, new Dictionary<string, string>
            {
                {"name", name}
            });

            var optimizedTitle = OptimizeTitle(processedTitle);
            var optimizedDescription = OptimizeMetaDescription(processedDescription);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"{name}, {defaultKeywords}",
                CanonicalUrl = CreateCanonicalUrl(url, baseUrl),
                OgTitle = processedTitle,
                OgDescription = optimizedDescription,
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = "website",
                OgUrl = CreateCanonicalUrl(url, baseUrl),
                TwitterTitle = processedTitle,
                TwitterDescription = optimizedDescription,
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                Robots = "index, follow",
                SitemapPriority = 0.5,
                SitemapChangeFreq = "weekly",
                Breadcrumbs = await _breadcrumbService.GetTagBreadcrumbsAsync(tagId, name, url)
            };
        }

        public async Task<SeoModel> GetSearchSeoAsync(string query, string url, bool hasResults, int? totalResults = null)
        {
            // Get templates from AppConfig
            var titleTemplate = hasResults
                ? await GetConfigValueAsync("SEO.Search.TitleTemplate", "Tìm kiếm: {query} - LADA Express")
                : await GetConfigValueAsync("SEO.Search.NoResultsTitle", "Không tìm thấy kết quả - LADA Express");

            var descriptionTemplate = hasResults
                ? await GetConfigValueAsync("SEO.Search.DescriptionTemplate", "Kết quả tìm kiếm cho \"{query}\" tại LADA Express. Tìm kiếm dịch vụ và thông tin vận chuyển.")
                : await GetConfigValueAsync("SEO.Search.NoResultsDescription", "Không tìm thấy kết quả phù hợp. Hãy thử từ khóa khác hoặc liên hệ LADA Express để được hỗ trợ.");

            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);
            var defaultImage = await GetConfigValueAsync("SEO.DefaultImage", _defaultImage);

            // Process templates
            var processedTitle = ProcessTemplate(titleTemplate, new Dictionary<string, string>
            {
                {"query", query},
                {"totalResults", totalResults?.ToString() ?? "0"}
            });

            var processedDescription = ProcessTemplate(descriptionTemplate, new Dictionary<string, string>
            {
                {"query", query},
                {"totalResults", totalResults?.ToString() ?? "0"}
            });

            var optimizedTitle = OptimizeTitle(processedTitle);
            var optimizedDescription = OptimizeMetaDescription(processedDescription);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = $"tìm kiếm, {query}, LADA Express",
                CanonicalUrl = CreateCanonicalUrl(url, baseUrl),
                OgTitle = processedTitle,
                OgDescription = optimizedDescription,
                OgImage = CreateCanonicalUrl(defaultImage, baseUrl),
                OgType = "website",
                OgUrl = CreateCanonicalUrl(url, baseUrl),
                TwitterTitle = processedTitle,
                TwitterDescription = optimizedDescription,
                TwitterImage = CreateCanonicalUrl(defaultImage, baseUrl),
                Robots = hasResults ? "index, follow" : "noindex, follow",
                SitemapPriority = 0.3,
                SitemapChangeFreq = "never",
                Breadcrumbs = await _breadcrumbService.GetSearchBreadcrumbsAsync(query, url)
            };
        }

        public async Task<SeoModel> GetCustomSeoAsync(string title, string description, string url, string? image = null, string? keywords = null)
        {
            var optimizedTitle = OptimizeTitle($"{title} | {_siteName}");
            var optimizedDescription = OptimizeMetaDescription(description);

            return new SeoModel
            {
                Title = optimizedTitle,
                Description = optimizedDescription,
                Keywords = keywords ?? "",
                CanonicalUrl = CreateCanonicalUrl(url),
                OgTitle = title,
                OgDescription = optimizedDescription,
                OgImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(_defaultImage) : CreateCanonicalUrl(image),
                OgType = "website",
                OgUrl = CreateCanonicalUrl(url),
                TwitterTitle = title,
                TwitterDescription = optimizedDescription,
                TwitterImage = string.IsNullOrEmpty(image) ? CreateCanonicalUrl(_defaultImage) : CreateCanonicalUrl(image),
                SitemapPriority = 0.5,
                SitemapChangeFreq = "monthly"
            };
        }

        public List<BreadcrumbItem> CreateBreadcrumbs(params (string name, string url)[] items)
        {
            var breadcrumbs = new List<BreadcrumbItem>();
            for (int i = 0; i < items.Length; i++)
            {
                breadcrumbs.Add(new BreadcrumbItem
                {
                    Name = items[i].name,
                    Url = CreateCanonicalUrl(items[i].url),
                    Position = i + 1
                });
            }
            return breadcrumbs;
        }

        public List<string> ValidateSeoModel(SeoModel seoModel)
        {
            var errors = new List<string>();

            if (string.IsNullOrEmpty(seoModel.Title))
                errors.Add("Title không được để trống");
            else if (seoModel.Title.Length > 60)
                errors.Add($"Title quá dài ({seoModel.Title.Length} ký tự). Nên dưới 60 ký tự");

            if (string.IsNullOrEmpty(seoModel.Description))
                errors.Add("Meta description không được để trống");
            else if (seoModel.Description.Length > 160)
                errors.Add($"Meta description quá dài ({seoModel.Description.Length} ký tự). Nên dưới 160 ký tự");

            if (string.IsNullOrEmpty(seoModel.CanonicalUrl))
                errors.Add("Canonical URL không được để trống");

            if (string.IsNullOrEmpty(seoModel.OgTitle))
                errors.Add("Open Graph title không được để trống");

            if (string.IsNullOrEmpty(seoModel.OgDescription))
                errors.Add("Open Graph description không được để trống");

            return errors;
        }

        public string CreateCanonicalUrl(string path)
        {
            if (path.StartsWith("http"))
                return path;

            if (!path.StartsWith("/"))
                path = "/" + path;

            return $"{_baseUrl.TrimEnd('/')}{path}";
        }

        public string CreateCanonicalUrl(string path, string baseUrl)
        {
            // Handle null or empty path
            if (string.IsNullOrEmpty(path))
                return baseUrl?.TrimEnd('/') ?? _baseUrl.TrimEnd('/');

            // Handle null baseUrl
            if (string.IsNullOrEmpty(baseUrl))
                baseUrl = _baseUrl;

            if (path.StartsWith("http"))
                return path;

            if (!path.StartsWith("/"))
                path = "/" + path;

            return $"{baseUrl.TrimEnd('/')}{path}";
        }

        /// <summary>
        /// Helper method để lấy config từ AppConfig với fallback
        /// </summary>
        /// <param name="key">Config key</param>
        /// <param name="defaultValue">Default value nếu không tìm thấy</param>
        /// <returns>Config value</returns>
        private async Task<string> GetConfigValueAsync(string key, string defaultValue)
        {
            try
            {
                var value = await _appConfigService.GetConfigValueAsync(key, defaultValue);
                return string.IsNullOrEmpty(value) ? defaultValue : value;
            }
            catch
            {
                return defaultValue;
            }
        }

        public string OptimizeMetaDescription(string text, int maxLength = 155)
        {
            if (string.IsNullOrEmpty(text))
                return "";

            // Loại bỏ HTML tags
            text = Regex.Replace(text, "<.*?>", "");

            // Loại bỏ khoảng trắng thừa
            text = Regex.Replace(text, @"\s+", " ").Trim();

            if (text.Length <= maxLength)
                return text;

            // Cắt ngắn và thêm "..."
            var truncated = text.Substring(0, maxLength - 3);
            var lastSpace = truncated.LastIndexOf(' ');

            if (lastSpace > 0)
                truncated = truncated.Substring(0, lastSpace);

            return truncated + "...";
        }

        public string OptimizeTitle(string title, int maxLength = 60)
        {
            if (string.IsNullOrEmpty(title))
                return "";

            if (title.Length <= maxLength)
                return title;

            // Cắt ngắn nhưng không cắt giữa từ
            var truncated = title.Substring(0, maxLength - 3);
            var lastSpace = truncated.LastIndexOf(' ');

            if (lastSpace > 0)
                truncated = truncated.Substring(0, lastSpace);

            return truncated + "...";
        }

        /// <summary>
        /// Xử lý template với các placeholder
        /// </summary>
        /// <param name="template">Template string với placeholders như {title}, {description}</param>
        /// <param name="values">Dictionary chứa các giá trị thay thế</param>
        /// <returns>Processed string</returns>
        private string ProcessTemplate(string template, Dictionary<string, string> values)
        {
            if (string.IsNullOrEmpty(template))
                return "";

            var result = template;
            foreach (var kvp in values)
            {
                if (!string.IsNullOrEmpty(kvp.Value))
                {
                    result = result.Replace($"{{{kvp.Key}}}", kvp.Value);
                }
            }

            return result;
        }

        /// <summary>
        /// Tạo breadcrumbs async với AppConfig support
        /// </summary>
        /// <param name="items">Danh sách breadcrumb items</param>
        /// <returns>List of BreadcrumbItem</returns>
        public async Task<List<BreadcrumbItem>> CreateBreadcrumbsAsync(params (string name, string url)[] items)
        {
            var breadcrumbs = new List<BreadcrumbItem>();
            var baseUrl = await GetConfigValueAsync("SEO.BaseUrl", _baseUrl);

            for (int i = 0; i < items.Length; i++)
            {
                breadcrumbs.Add(new BreadcrumbItem
                {
                    Name = items[i].name,
                    Url = CreateCanonicalUrl(items[i].url, baseUrl),
                    Position = i + 1
                });
            }
            return breadcrumbs;
        }
    }
}