using Edu.Model.CacheModel;
using Edu.Model.ViewModel.User;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Ccc.V20200210.Models;
using TencentCloud.Common;

namespace Edu.ThirdCore.TenCloud
{
    /// <summary>
    /// 腾讯呼叫中心帮助类
    /// </summary>
    public class TenCloudCCCHelper
    {
        private static readonly long SDKAPPID = 1400617921;

        /// <summary>
        /// 创建客服账号
        /// </summary>
        /// <param name="employee"></param>
        /// <returns></returns>
        public async Task<(bool result, string message)> SetUserToCCCUser(Employee_ViewModel employee)
        {
            CreateStaffRequest req = new CreateStaffRequest
            {
                SdkAppId = SDKAPPID
            };
            SeatUserInfo seatUserInfo1 = new SeatUserInfo
            {
                Name = employee.EmployeeName,
                Mail = employee.Email,
                Phone = employee.EmployeeTel,
                Nick = employee.EmployeeName.ToCharArray()[0] + "老师",
                UserId = employee.Id.ToString(),
                StaffNumber = employee.Id.ToString()
            };
            req.Staffs = new SeatUserInfo[] { seatUserInfo1 };
            var credential = TenCloudCredential._instance;
            CreateStaffResponse resp = credential.CreateStaffSync(req);
            if (resp.ErrorStaffList != null && resp.ErrorStaffList.Length > 0)
            {
                return (false, resp.ErrorStaffList[0].Message);
            }
            else
            {
                var groupId = QueryDescribeSkillGroup();
                if (groupId == null)
                {
                    return (false, "电话客服添加成功,但是关联技能组失败");
                }
                else
                {
                    SetTenUserStaffSkillGroupList(employee.Email, groupId);
                }
                return (true, "添加成功");
            }
        }

        public void SetTenUserStaffSkillGroupList(string mail, long?[] list)
        {
            var credential = TenCloudCredential._instance;
            BindStaffSkillGroupListRequest req = new BindStaffSkillGroupListRequest
            {
                SdkAppId = SDKAPPID,
                StaffEmail = mail,
                SkillGroupList = list
            };
            BindStaffSkillGroupListResponse resp = credential.BindStaffSkillGroupListSync(req);
        }

        /// <summary>
        /// 获取技能组数组
        /// </summary>
        /// <returns></returns>
        public long?[] QueryDescribeSkillGroup()
        {
            var credential = TenCloudCredential._instance;
            DescribeSkillGroupInfoListRequest req = new DescribeSkillGroupInfoListRequest
            {
                SdkAppId = SDKAPPID,
                PageSize = 1,
                PageNumber = 100
            };
            DescribeSkillGroupInfoListResponse resp = credential.DescribeSkillGroupInfoListSync(req);
            if (resp.SkillGroupList != null && resp.SkillGroupList.Length > 0)
            {
                return resp.SkillGroupList.Select(x => x.SkillGroupId).ToArray();
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 删除坐席
        /// </summary>
        /// <param name="employee"></param>
        /// <returns></returns>
        public async Task<(bool result, string message)> DelUserToCCCUser(Employee_ViewModel employee)
        {
            var credential = TenCloudCredential._instance;
            DeleteStaffRequest req = new DeleteStaffRequest
            {
                SdkAppId = SDKAPPID,
                StaffList = new string[] { employee.Email }
            };
            DeleteStaffResponse resp = credential.DeleteStaffSync(req);
            return (resp.OnlineStaffList == null, "");
        }

        /// <summary>
        /// 获取电话客服的Token
        /// </summary>
        /// <returns></returns>
        public async Task<TenCccTokenItem> GetTenCccUserToken(string mail)
        {
            var credential = TenCloudCredential._instance;
            var tenCccTokenItem = new TenCccTokenItem();
            CreateSDKLoginTokenRequest req = new CreateSDKLoginTokenRequest
            {
                SdkAppId = SDKAPPID,
                SeatUserId = mail
            };
            CreateSDKLoginTokenResponse resp = credential.CreateSDKLoginTokenSync(req);
            tenCccTokenItem.SdkURL = resp.SdkURL;
            tenCccTokenItem.Token = resp.Token;
            return tenCccTokenItem;
        }
    }
}