using JSMR.Infrastructure.Integrations.DLSite.Serialization;
using System.Text.Json.Serialization;

namespace JSMR.Infrastructure.Integrations.DLSite.Models;

public class ProductInfo
{
    [JsonPropertyName("site_id")]
    public string? SiteId { get; set; }

    [JsonPropertyName("site_id_touch")]
    public string? SiteIdTouch { get; set; }

    [JsonPropertyName("maker_id")]
    public string? MakerId { get; set; }

    [JsonPropertyName("age_category")]
    public int AgeCategory { get; set; }

    [JsonPropertyName("affiliate_deny")]
    public int AffiliateDeny { get; set; }

    [JsonPropertyName("dl_count")]
    [JsonConverter(typeof(NumberConverter))]
    public int DownloadCount { get; set; }

    // This value can be a number or "false"
    [JsonPropertyName("wishlist_count")]
    [JsonConverter(typeof(NumberConverter))]
    public int WishlistCount { get; set; }

    [JsonPropertyName("dl_format")]
    public int DownloadFormat { get; set; }

    [JsonPropertyName("rank")]
    public ProductRank[] Rank { get; set; } = [];

    [JsonPropertyName("rate_average")]
    public int? RateAverage { get; set; }

    [JsonPropertyName("rate_average_2dp")]
    public decimal? RateAverage2DP { get; set; }

    [JsonPropertyName("rate_average_star")]
    public int? RateAverageStar { get; set; }

    [JsonPropertyName("rate_count")]
    public int? RateCount { get; set; }

    [JsonPropertyName("rate_count_detail")]
    public ProductRateCountDetail[] RateCountDetail { get; set; } = [];

    [JsonPropertyName("review_count")]
    [JsonConverter(typeof(NumberConverter))]
    public int ReviewCount { get; set; }

    [JsonPropertyName("price")]
    public int? Price { get; set; }

    [JsonPropertyName("price_without_tax")]
    public int? PriceWithoutTax { get; set; }

    [JsonPropertyName("price_str")]
    public string? PriceString { get; set; }

    [JsonPropertyName("default_point_rate")]
    public int? DefaultPointRate { get; set; }

    [JsonPropertyName("default_point")]
    public int DefaultPoint { get; set; }

    [JsonPropertyName("product_point_rate")]
    public int? ProductPointRate { get; set; }

    [JsonPropertyName("dlsiteplay_work")]
    public bool DLSitePlayWork { get; set; }

    [JsonPropertyName("is_sale")]
    public bool IsSale { get; set; }

    [JsonPropertyName("on_sale")]
    public int OnSale { get; set; }

    [JsonPropertyName("is_discount")]
    public bool IsDiscount { get; set; }

    [JsonPropertyName("is_pointup")]
    public bool IsPointUp { get; set; }

    //[JsonPropertyName("gift")]
    //[JsonConverter(typeof(ListConverter<string>))]
    //public List<string> Gift { get; set; }

    [JsonPropertyName("is_rental")]
    public bool IsRental { get; set; }

    [JsonPropertyName("work_rentals")]
    public string[] WorkRentals { get; set; } = [];

    [JsonPropertyName("upgrade_min_price")]
    public int UpgradeMinPrice { get; set; }

    [JsonPropertyName("down_url")]
    public string? DownloadURL { get; set; }

    [JsonPropertyName("is_tartget")]
    public string? IsTargetGet { get; set; }

    [JsonPropertyName("title_id")]
    public string? TitleId { get; set; }

    [JsonPropertyName("title_name")]
    public string? TitleName { get; set; }

    [JsonPropertyName("title_name_masked")]
    public string? TitleNameMasked { get; set; }

    [JsonPropertyName("title_volumn")]
    public int? TitleVolumeNumber { get; set; }

    [JsonPropertyName("title_work_count")]
    public int? TitleWorkCount { get; set; }

    [JsonPropertyName("is_title_completed")]
    public bool IsTitleCompleted { get; set; }

    [JsonPropertyName("bulkbuy_key")]
    public string? BulkBuyKey { get; set; }

    [JsonPropertyName("bonuses")]
    public ProductBonus[] Bonuses { get; set; } = [];

    [JsonPropertyName("is_limit_work")]
    public bool IsLimitWork { get; set; }

    [JsonPropertyName("is_sold_out")]
    public bool IsSoldOut { get; set; }

    [JsonPropertyName("limit_stock")]
    public int LimitStock { get; set; }

    [JsonPropertyName("is_reserve_work")]
    public bool IsReserveWork { get; set; }

    [JsonPropertyName("is_reservable")]
    public bool IsReservable { get; set; }

    [JsonPropertyName("is_timesale")]
    public bool IsTimeSale { get; set; }

    [JsonPropertyName("timesale_stock")]
    public int TimeSaleStock { get; set; }

    [JsonPropertyName("is_free")]
    public bool IsFree { get; set; }

    [JsonPropertyName("is_oly")]
    public bool IsOLY { get; set; }

    [JsonPropertyName("is_led")]
    public bool IsLED { get; set; }

    [JsonPropertyName("is_wcc")]
    public bool IsWCC { get; set; }

    [JsonPropertyName("translation_info")]
    public ProductTranslationInfo? TranslationInfo { get; set; }

    [JsonPropertyName("work_name")]
    public string? WorkName { get; set; }

    [JsonPropertyName("work_name_masked")]
    public string? WorkNameMasked { get; set; }

    [JsonPropertyName("work_image")]
    public string? WorkImage { get; set; }

    [JsonPropertyName("sales_end_info")]
    public string? SalesEndInfo { get; set; }

    [JsonPropertyName("voice_pack")]
    public string? VoicePack { get; set; }

    [JsonPropertyName("regist_date")]
    [JsonConverter(typeof(NullableDateTimeConverterUsingDateTimeParse))]
    public DateTime? RegistrationDate { get; set; }

    [JsonPropertyName("locale_price")]
    [JsonConverter(typeof(DictionaryConverter<string, decimal>))]
    public Dictionary<string, decimal> LocalePrice { get; set; } = [];

    [JsonPropertyName("locale_price_str")]
    [JsonConverter(typeof(DictionaryConverter<string, string>))]
    public Dictionary<string, string> LocalePriceString { get; set; } = [];

    [JsonPropertyName("work_type")]
    public string? WorkType { get; set; }

    [JsonPropertyName("book_type")]
    public string? BookType { get; set; }

    [JsonPropertyName("is_pack_work")]
    public bool IsPackWork { get; set; }

    [JsonPropertyName("limited_free_terms")]
    public string[] LimitedFreeTerms { get; set; } = [];

    [JsonPropertyName("dl_count_total")]
    public int DownloadCountTotal { get; set; }

    [JsonPropertyName("dl_count_items")]
    public DownloadCountItem[] DownloadCountItems { get; set; } = [];

    [JsonPropertyName("discount_rate")]
    public int? DiscountRate { get; set; }

    [JsonPropertyName("official_price")]
    public int? OfficialPrice { get; set; }

    // Don't know the type for sure
    [JsonPropertyName("campaign_id")]
    public string? CampaignId { get; set; }

    [JsonPropertyName("official_price_str")]
    public string? OfficialPriceString { get; set; }

    [JsonPropertyName("locale_official_price")]
    [JsonConverter(typeof(DictionaryConverter<string, decimal>))]
    public Dictionary<string, decimal> LocaleOfficialPrice { get; set; } = [];

    [JsonPropertyName("locale_official_price_str")]
    [JsonConverter(typeof(DictionaryConverter<string, string>))]
    public Dictionary<string, string> LocaleOfficialPriceString { get; set; } = [];

    // TODO: Convert to date
    [JsonPropertyName("discount_end_date")]
    public string? DiscountEndDate { get; set; }

    [JsonPropertyName("discount_to")]
    public string? DiscountTo { get; set; }

    [JsonPropertyName("discount_caption")]
    public string? DiscountCaption { get; set; }

    [JsonPropertyName("default_point_str")]
    public string? DefaultPointString { get; set; }

    [JsonPropertyName("options")]
    [JsonConverter(typeof(ProductInfoOptionsConverter))]
    public string[] Options { get; set; } = [];
}