using Adplay.Behaviours;
using Adplay.Model;
using Adplay.Utility;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Adplay.DataContainer
{
    [CreateAssetMenu(fileName = nameof(EngagementData), menuName = PathUtility.DataContainerPath + nameof(EngagementData))]
    public class EngagementData : ScriptableObject
    {
        [SerializeField] private List<Engagement> activeEngagement = new();

        public void Clear()
        {
            activeEngagement.Clear();
        }

        public void CreateEngagement(int adId, EngagementType engagementType, Creative creative)
        {
            var engagement = new Engagement()
            {
                Id = adId,
                CampaignId = creative.CampaignId,
                Platform = Application.platform == RuntimePlatform.Android ? Platform.AND : Platform.IOS,
                EngagementType = engagementType,
                AppId = 0,//TODO
                DeviceModel = AdPlayUtility.UniqueDeviceId,
                PublisherId = 0,//TODO
                UserIp = AdPlayUtility.PublicIp,
                GoogleAdId = AdPlayUtility.GoogleAdId,
                RegionId = 0,//TODO
                ZoneId = creative.ZoneId,
                CreativeId = creative.Id,//TODO
                AngleQuality = 0,//currently need this ?
                ScreenCoverage = 0,//currently need this ?
                VisibilityScore = 0,//currently need this ?
                Cost = creative.Price,
            };

            activeEngagement.Add(engagement);
            AdPlayBatchSender.SendBatch(engagement);
        }

        public void UpdateDuration(int adId, float duration)
        {
            var engagement = activeEngagement.FirstOrDefault(e => e.Id == adId);
            if (engagement != null)
            {
                engagement.Duration = (int)duration;
            }
        }

        public List<Engagement> GetEngagements()
        {
            return activeEngagement.Select(a => a).ToList();//make new list not reference type
        }

        public void Remove(List<Engagement> engagements)
        {
            foreach (var engagement in engagements)
            {
                var sentEngagement = activeEngagement.FirstOrDefault(a => a.Id == engagement.Id);

                if (sentEngagement != null)
                    activeEngagement.Remove(sentEngagement);
            }
        }


#if UNITY_EDITOR
        [ContextMenu("Json")]
        private void LogJson()
        {
            Debug.Log("Json: " + Newtonsoft.Json.JsonConvert.SerializeObject(activeEngagement));
        }
    }
#endif
}
