using Shared.Engine.Pools; using System.Text; using System.Text.Json.Serialization; namespace Shared.Models.Templates { public class SeasonTpl : ITplResult { public List data { get; private set; } public string quality { get; private set; } public VoiceTpl? vtpl { get; private set; } public SeasonTpl() : this(null, null, 10) { } public SeasonTpl(int capacity) : this(null, null, capacity) { } public SeasonTpl(string quality) : this(null, quality, 10) { } public SeasonTpl(string quality, int capacity) : this(null, quality, capacity) { } public SeasonTpl(VoiceTpl vtpl) : this(vtpl, null, 10) { } public SeasonTpl(VoiceTpl vtpl, int capacity) : this(vtpl, null, capacity) { } public SeasonTpl(VoiceTpl? vtpl, string quality, int capacity) { data = new List(capacity); this.vtpl = vtpl; this.quality = quality; } public void Append(string name, string link, string id) { int.TryParse(id, out int sid); Append(name, link, sid); } public void Append(string name, string link, int id) { if (!string.IsNullOrEmpty(name)) data.Add(new SeasonDto(link, name, id)); } public void Append(VoiceTpl vtpl) { this.vtpl = vtpl; } public bool IsEmpty => data == null || data.Count == 0; public int Length => data?.Count ?? 0; public string ToHtml() { if (IsEmpty) return string.Empty; var sb = ToBuilderHtml(); string result = sb.ToString(); StringBuilderPool.Return(sb); return result; } public StringBuilder ToBuilderHtml() { if (IsEmpty) return StringBuilderPool.EmptyHtml; var html = StringBuilderPool.Rent(); bool firstjson = true; if (vtpl.HasValue) vtpl.Value.WriteTo(html); html.Append("
"); if (!string.IsNullOrEmpty(quality)) html.Append($""); foreach (var i in data) { html.Append("
"); html.Append("
"); UtilsTpl.HtmlEncode(i.name, html); html.Append("
"); firstjson = false; } html.Append("
"); return html; } public string ToJson() { if (IsEmpty) return string.Empty; var sb = ToBuilderJson(); string result = sb.ToString(); StringBuilderPool.Return(sb); return result; } public StringBuilder ToBuilderJson() { if (IsEmpty) return StringBuilderPool.EmptyJsonObject; var json = StringBuilderPool.Rent(); UtilsTpl.WriteJson(json, new SeasonResponseDto ( quality, vtpl?.ToObject(emptyToNull: true), data ), SeasonJsonContext.Default.SeasonResponseDto); return json; } } [JsonSourceGenerationOptions( DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault )] [JsonSerializable(typeof(SeasonDto))] [JsonSerializable(typeof(VoiceDto))] [JsonSerializable(typeof(SeasonResponseDto))] [JsonSerializable(typeof(List))] [JsonSerializable(typeof(List))] public partial class SeasonJsonContext : JsonSerializerContext { } public readonly struct SeasonDto { public string method { get; } public int? id { get; } public string url { get; } public string name { get; } [JsonConstructor] public SeasonDto(string url, string name, int? id) { method = "link"; this.id = id; this.url = url; this.name = name; } } public readonly struct SeasonResponseDto { public string type { get; } public string maxquality { get; } public IReadOnlyList voice { get; } public IReadOnlyList data { get; } [JsonConstructor] public SeasonResponseDto(string maxquality, IReadOnlyList voice, IReadOnlyList data) { type = "season"; this.maxquality = maxquality; this.voice = voice; this.data = data; } } }