// using System.Net;
// using AngleSharp.Html.Parser;
//
// namespace ReferenceClientProxyImplementation.Services;
//
// public class BuildDownloadService(ILogger logger) {
// private static readonly HttpClient hc = new();
//
// public async Task DownloadBuildFromArchiveOrg(string outputDirectory, DateTime timestamp) {
// // 20150906025145
// var paddedTimestamp = timestamp.ToString("yyyyMMddHHmmss");
// await DownloadBuildFromUrl(outputDirectory, $"https://web.archive.org/web/{paddedTimestamp}im_/https://discordapp.com/login");
// }
//
// public async Task DownloadBuildFromUrl(string outputDirectory, string url) {
// logger.LogInformation("Downloading build from {url} to {outDir}", url, outputDirectory);
// var response = await hc.GetAsync(url);
// if (!response.IsSuccessStatusCode)
// throw new Exception($"Failed to download build from {url}");
// var html = await response.Content.ReadAsStringAsync();
// File.WriteAllText(outputDirectory + "/index.html", html);
// var parser = new HtmlParser();
// var document = parser.ParseDocument(html);
// var assets = document.QuerySelectorAll("link[rel=stylesheet], link[rel=icon], script, img");
// foreach (var asset in assets) {
// var assetUrl = asset.GetAttribute("href") ?? asset.GetAttribute("src");
// if (assetUrl == null)
// continue;
// if (assetUrl.StartsWith("//")) {
// logger.LogWarning("Skipping asset {assetUrl} as it is a protocol-relative URL", assetUrl);
// continue;
// }
//
// var assetStream = await GetAssetStream(assetUrl);
// var assetPath = Path.Combine(outputDirectory, assetUrl.TrimStart('/'));
// Console.WriteLine($"Downloading asset {assetUrl} to {assetPath}");
// Directory.CreateDirectory(Path.GetDirectoryName(assetPath));
// await using var fs = File.Create(assetPath);
// await assetStream.CopyToAsync(fs);
// }
//
// logger.LogInformation("Downloading build from {url} complete!", url);
// }
//
// public async Task GetAssetStream(string asset) {
// asset = asset.Replace("/assets/", "");
// var urlsToTry = new Stack(new[] {
// $"https://web.archive.org/web/0id_/https://discordapp.com/assets/{asset}",
// $"https://web.archive.org/web/0id_/https://discord.com/assets/{asset}",
// $"https://discord.com/assets/{asset}"
// });
// while (urlsToTry.TryPop(out var urlToTry)) {
// if (string.IsNullOrWhiteSpace(urlToTry)) continue;
// try {
// var response = await hc.GetAsync(urlToTry, HttpCompletionOption.ResponseHeadersRead);
// if (response.IsSuccessStatusCode) {
// Console.WriteLine($"Got success for asset {asset} from {urlToTry}");
// return await response.Content.ReadAsStreamAsync();
// }
// //redirect
//
// if (response.StatusCode == HttpStatusCode.Found) {
// var redirectUrl = response.Headers.Location?.ToString();
// if (string.IsNullOrWhiteSpace(redirectUrl)) continue;
// urlsToTry.Push(redirectUrl);
// }
// else logger.LogWarning("Failed to download asset {asset} from {urlToTry}", asset, urlToTry);
// }
// catch {
// // ignored
// }
// }
//
// throw new Exception($"Failed to download asset {asset}");
// }
// }