using System.Collections.Generic;
using EventPartnerGatherRequests;
using System.Linq;
using asap.core;
using game;
using System;
namespace EventPartner
{
///
/// Store invitation data, but not necessarrily the info shown on panel, meaning, no potential robot info.
///
public class InvitationData
{
// List block priority: Refuse = Partners > Invite > Request > Friend > Recommend
private HashSet _refusePfIdSet = new HashSet();
private HashSet _invitePfIdSet = new HashSet();
private HashSet _requestPfIdSet = new HashSet();
private HashSet _friendPfIdSet = new HashSet();
private HashSet _recommendPfIdSet = new HashSet();
// private DateTime _recommendExpiryTime = DateTime.MinValue;
private IEventPartnerArchitecture _arc;
public HashSet RefusePfIdSet => _refusePfIdSet;
public HashSet InvitePfIdSet => _invitePfIdSet;
public HashSet RequestPfIdSet => _requestPfIdSet;
public HashSet FriendPfIdSet => _friendPfIdSet;
public HashSet RecommendPfIdSet => _recommendPfIdSet;
private int _invitationCount;
private readonly cfg.Tables _tables = GContext.container.Resolve();
public int ActiveFriendCountThreshold => _tables.TbEventPartnerConfig.FriendRecommendParam1[0];
public int RecommendCount => _tables.TbEventPartnerConfig.FriendRecommendParam2[GContext.container.Resolve().FriendList.Count < ActiveFriendCountThreshold ? 0 : 1];
public int RecommendTriggerCount => _tables.TbEventPartnerConfig.RobotRecommendTriggerCount;
public bool DoRecommendBot => _invitationCount >= RecommendTriggerCount;
public float RobotRecommendRatio => _tables.TbEventPartnerConfig.RobotRecommendCount;
public int InvitationCount => _invitationCount;
// public DateTime RecommendExpiryTime => _recommendExpiryTime;
public InvitationData(IEventPartnerArchitecture arc)
{
_arc = arc;
}
public void Init(HashSet refusePfIdSet, InvitationCache recommendCache)
{
_refusePfIdSet = refusePfIdSet;
// _recommendExpiryTime = recommendCache.ExpiryTime;
_recommendPfIdSet = recommendCache.RecommendPfIds.ToHashSet();
_invitationCount = recommendCache.InvitationCount;
}
public void FillInDetail(HashSet partners, EventPartnerGatherDetail detail)
{
var selfPfId = GContext.container.Resolve().UserId;
_invitePfIdSet = detail.InvitePartners
.Select(x => x.PlayFabId)
.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId)
.ToHashSet();
_requestPfIdSet = detail.RequestPartners
.Select(x => x.PlayFabId)
.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId
&& !_invitePfIdSet.Contains(s))
.ToHashSet();
_friendPfIdSet = GContext.container.Resolve().FriendList
.Select(x => x.playFabId)
.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId
&& !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s))
.ToHashSet();
// if (ZZTimeHelper.UtcNow() < _recommendExpiryTime)
// _recommendPfIdSet = _recommendPfIdSet
// .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId
// && !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s) && !_friendPfIdSet.Contains(s))
// .ToHashSet();
// else
// {
_recommendPfIdSet = GenerateNewRecommendList(detail).ToHashSet();
// _recommendExpiryTime = ZZTimeHelper.UtcNow() + TimeSpan.FromSeconds(GContext.container.Resolve().TbEventPartnerConfig.FriendRecommendListRefreshTime);
// }
_arc.SavePlayerPreference();
}
public void FillInFriends()
{
var selfPfId = GContext.container.Resolve().UserId;
var partners = _arc.Model.PartnerIdSet;
_friendPfIdSet = GContext.container.Resolve().FriendList
.Select(x => x.playFabId)
.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId
&& !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s))
.ToHashSet();
}
public bool IsRefused(string pfId)
{
return _refusePfIdSet.Contains(pfId);
}
public void OnInvite(string pfId)
{
_invitePfIdSet.Add(pfId);
_requestPfIdSet.Remove(pfId);
_friendPfIdSet.Remove(pfId);
_recommendPfIdSet.Remove(pfId);
_refusePfIdSet.Remove(pfId);
_invitationCount++;
}
public void OnAccept(string pfId)
{
_invitePfIdSet.Remove(pfId);
_requestPfIdSet.Remove(pfId);
_friendPfIdSet.Remove(pfId);
_recommendPfIdSet.Remove(pfId);
_refusePfIdSet.Remove(pfId);
}
public void OnRefuse(string pfId)
{
_invitePfIdSet.Remove(pfId);
_requestPfIdSet.Remove(pfId);
_friendPfIdSet.Remove(pfId);
_recommendPfIdSet.Remove(pfId);
_refusePfIdSet.Add(pfId);
}
public void OnRequest(string pfId)
{
_invitePfIdSet.Remove(pfId);
_requestPfIdSet.Add(pfId);
_friendPfIdSet.Remove(pfId);
_recommendPfIdSet.Remove(pfId);
_refusePfIdSet.Remove(pfId);
}
public InvitationCache ToCache()
{
var res = new InvitationCache();
// res.ExpiryTime = _recommendExpiryTime;
res.RecommendPfIds = _recommendPfIdSet.ToList();
res.RefusePfIds = _refusePfIdSet.ToList();
res.InvitationCount = _invitationCount;
return res;
}
public IEnumerable GenerateNewRecommendList(EventPartnerGatherDetail detail)
{
var count = RecommendCount;
var res = new List();
if (DoRecommendBot)
{
var actualBotCount = (int)(count * RobotRecommendRatio);
res.AddRange(detail.RecommendInfoList.Select(x => x.PlayFabId).Take(count - actualBotCount));
res.AddRange(_arc.Ctx.GetBotRecommendIdList(actualBotCount));
}
else
res.AddRange(detail.RecommendInfoList.Select(x => x.PlayFabId).Take(count));
var partners = detail.Partners.Select(x => x.PlayFabId).ToHashSet();
var selfPfId = GContext.container.Resolve().UserId;
return res.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId
&& !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s) && !_friendPfIdSet.Contains(s));
}
// #if UNITY_EDITOR
// public void RefreshInvitation()
// {
// _recommendExpiryTime = ZZTimeHelper.UtcNow();
// }
// #endif
public void SetInvitationCount(int n)
{
_invitationCount = n;
}
}
public class InvitationCache
{
public List RecommendPfIds { get; set; } = new List();
public List RefusePfIds { get; set; } = new List();
public int InvitationCount { get; set; }
}
}