using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Adplay.Model
{
    [System.Serializable]
    public class Creative
    {
        [JsonProperty("id")][field: SerializeField] public int Id { get; set; }

        [JsonProperty("ad_type")]
        [JsonConverter(typeof(StringEnumConverter))][field: SerializeField] public AdType Type { get; set; }

        [JsonProperty("ad_placement_type")]
        [JsonConverter(typeof(StringEnumConverter))][field: SerializeField] public AdPlacementType AdPlacementType { get; set; }
        
        [JsonProperty("show_type")]
        [JsonConverter(typeof(StringEnumConverter))][field: SerializeField] public CreativeShowType ShowType { get; set; }
        
        [JsonProperty("weight")][field: SerializeField] public int Weight { get; set; }
        [JsonProperty("campaign_id")][field: SerializeField] public int CampaignId { get; set; }
        [JsonProperty("asset_url")][field: SerializeField] public string AssetUrl { get; set; }
        [JsonProperty("click_url")][field: SerializeField] public string ClickUrl { get; set; }
        [JsonProperty("zone_id")][field: SerializeField] public int ZoneId { get; set; }
        [JsonProperty("price")][field: SerializeField] public int Price { get; set; }
        [JsonProperty("format")][field: SerializeField] public CreativeFormat Format { get; set; }
        [JsonProperty("config")][field: SerializeField] public Dictionary<string, object> Config { get; set; } = new();

#if UNITY_EDITOR
        [JsonIgnore]
        [field: SerializeField] private List<Map> ConfigMaps { get; set; } = new();

        public void Log()
        {
            ConfigMaps = Config.Select(kvp => new Map()
            {
                Key = kvp.Key,
                Value = kvp.Value.ToString()
            }).ToList();
        }

        [System.Serializable]
        public class Map
        {
            [field: SerializeField] public string Key { get; set; }
            [field: SerializeField] public string Value { get; set; }
        }
#endif

    }
}
