using Ropin.Inspection.Common.Helper;
using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Repository
{
    public class TmtnPushMsgToRepository : RepositoryBase<TMTN_PushMsgTo, string>, ITmtnPushMsgToRepository
    {
        public TmtnPushMsgToRepository(InspectionDbContext DbContext) : base(DbContext)
        {

        }

        public Task<int> DeleteByDevPersonIdAsync(string devId, string personId)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("devId", devId), new MySqlConnector.MySqlParameter("personId", personId) };
            int result = EntityFrameworkCoreExtensions.ExecuteSqlNoQuery(DbContext.Database, "DELETE from TMTN_PushMsgTo WHERE C_DevStoreCode = @devId AND C_PushPersonCode =@personId", parameters);
            return Task.FromResult(result);

        }
        public Task<int> DeleteByDevPersonIdMultipleAsync(string devId, string personStr)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("devId", devId) };
            string delSql = $"DELETE from TMTN_PushMsgTo WHERE C_DevStoreCode = @devId AND C_PushPersonCode  in ('{personStr}')";
            int result = EntityFrameworkCoreExtensions.ExecuteSqlNoQuery(DbContext.Database, delSql, parameters);
            return Task.FromResult(result);

        }
        public Task<IEnumerable<TSYS_User>> GetPushMsgUserByAsync(string devStoreCode, string msgTypeCode)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] {
                new MySqlConnector.MySqlParameter("devStoreCode", devStoreCode),
            new MySqlConnector.MySqlParameter("msgTypeCode", msgTypeCode)};
            string sql =  @"SELECT B.* FROM TMTN_PushMsgTo A
INNER JOIN TSYS_User B
ON A.C_PushPersonCode = B.C_UserID
WHERE A.C_DevStoreCode = @devStoreCode AND A.C_MsgTypeCode = @msgTypeCode AND B.C_Status = '1'";
            var contentlist = EntityFrameworkCoreExtensions.GetList<TSYS_User>(DbContext.Database, sql, parameters);
            return Task.FromResult(contentlist);

        }
        public Task<IEnumerable<TmtnPushMsgToUserViewModel>> GetPushMsgToUsersByAsync(string devStoreCode)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] {
                new MySqlConnector.MySqlParameter("devStoreCode", devStoreCode)};
            string sql = @"SELECT A.C_UserID as PushPersonCode,A.C_Name as PushPersonName,C.C_Name as RoleName
From TSYS_User A 
LEFT JOIN TSYS_UserRole B ON A.C_UserID = B.C_UserCode 
LEFT JOIN TSYS_Role C ON C.C_Code = B.C_RoleCode 
INNER JOIN TMTN_PushMsgTo D ON D.C_PushPersonCode = A.C_UserID
WHERE D.C_DevStoreCode = @devStoreCode And A.C_Status = '1' And C.C_Status = '1' GROUP BY A.C_UserID";
            var contentlist = EntityFrameworkCoreExtensions.GetList<TmtnPushMsgToUserViewModel>(DbContext.Database, sql, parameters);
            return Task.FromResult(contentlist);

        }
        public Task<TmtnUserPushMsgToViewModel> GetPushMsgTosByAsync(string devStoreCode, string userCode)
        {
            List<TMTN_PushMsgTo> pushMsgToList = DbContext.TMTN_PushMsgTo.Where(x=>x.C_DevStoreCode == devStoreCode && x.C_PushPersonCode == userCode).ToList();
            List<TMTN_PushMsgTo> pushMsgToMsgTypeList = new List<TMTN_PushMsgTo>(pushMsgToList);
            List<TMTN_PushMsgTo> pushMsgToPushTypeList = new List<TMTN_PushMsgTo>(pushMsgToList);
            List<string> msgTypeList = pushMsgToMsgTypeList.Select(y => y.C_MsgTypeCode).ToList();
            List<string> pushTypeList = pushMsgToPushTypeList.Select(y => y.C_PushTypeCode).ToList();
            TmtnUserPushMsgToViewModel mode = new TmtnUserPushMsgToViewModel
            {
                DevStoreCode = devStoreCode,
                UserCode = userCode,
                MsgTypeList = msgTypeList,
                PushTypeList = pushTypeList
            };
            return Task.FromResult(mode);

        }

        public async Task<bool> PushAlarmMsgAsync(TpushMsgModel pushModel)
        {
            IEnumerable<TMTN_PushMsgTo> pushMsgTolist = DbContext.Set<TMTN_PushMsgTo>().Where(i => i.C_DevStoreCode.Equals(pushModel.C_DevStoreCode)).AsEnumerable();
            IList<TSYS_User> userList = DbContext.Set<TSYS_User>().Where(x => x.C_Status == "1").AsEnumerable().ToList();
            IList<TBDM_CodeDetail> tBDMCodeDetailList = DbContext.Set<TBDM_CodeDetail>().Where(x => x.C_Status == "1").AsEnumerable().ToList();
            foreach (var pushMsgToItem in pushMsgTolist)
            {
                var user = userList.Where(x => x.C_UserID.ToString() == pushMsgToItem.C_PushPersonCode)?.FirstOrDefault();
                IList<string> sendUserWechatIDList = new List<string>();
                IList<TMTN_PushMsgResult> pushMsgResultList = new List<TMTN_PushMsgResult>();
                if (pushMsgToItem.C_PushTypeCode == "PUSH_TYPE_001")//Email
                {
                    //var q = from e in userList
                    //        where e.C_UserID == Guid.Parse("d4f4f4ac-3248-418a-a489-498478665537")
                    //        //where e.C_Email == "154817501@qq.com"
                    //        select new { e.C_Email};
                    //string email = q?.ToList()?.FirstOrDefault()?.C_Email;
                    //string email = userList.Where(x => x.C_UserID.ToString() == pushMsgToItem.C_PushPersonCode)?.Select(y => y.C_Email)?.FirstOrDefault();
                    string email = user.C_Email;
                    if (!string.IsNullOrEmpty(email))
                    {
                        string msg =
                               "<p><td>设备编号:</td>" + pushModel.DevNumber + "</p>" +
                               "<p><td>设备名称:</td>" + pushModel.DevName + "</p>" +
                               "<p><td>消息内容:</td>" + pushModel.Msg + "</p>" +
                               "<p><td>设备地址:</td>" + pushModel.DevAddress + "</p>" +
                               "<p><td> 报警时间:</td> " + DateTime.Now + " </p> "
                                    ;
                        EmailHelper.SendEmail(email, tBDMCodeDetailList.Where(i => i.C_Code == pushMsgToItem.C_MsgTypeCode).Select(x => x.C_Name).FirstOrDefault(), pushModel.Subject, pushModel.Msg);
                    }
                        
                }
                if (pushMsgToItem.C_PushTypeCode == "PUSH_TYPE_002")//wx
                {
                    var msg = new
                    {
                        thing2 = new { value = "niu" ?? "" },
                        time4 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") },
                        thing5 = new { value = "异常" ?? "" },
                        thing6 = new { value = "大门损坏" ?? "" },
                        thing9 = new { value = "msg" ?? "" }
                    };
                    sendUserWechatIDList.Add(user.C_WechatID);

                    pushMsgResultList.Add(new TMTN_PushMsgResult { C_ID = Guid.NewGuid().ToString(),
                        D_CreateOn = DateTime.Now,
                        C_Status = "1"
                    });


                    //new WeChatHelper(_httpClientFactory).PushMessageToUser(userlist, msg);
                    //var content = _mapper.Map<TMTN_PushMsgResult>(createModel);
                    //content.C_ID = Guid.NewGuid().ToString();
                    //content.C_CreateBy = _claims.ApiUserId;
                    //content.D_CreateOn = DateTime.Now;
                    //content.C_Status = "1";
                    //_tmtnPushMsgResultRepository.Create(content);
                    //var result = await _repository.SaveAsync();
                    //if (!result)
                    //{
                    //    throw new Exception("创建失败");
                    //}
                }
                //if (sendUserWechatIDList.Any())
                //{
                //    new WeChatHelper(_httpClientFactory).PushMessageToUser(sendUserWechatIDList, msg);
                //}
            }


            return await Task.FromResult(true);
        }

        //public Task<IEnumerable<TmtnPushMsgToViewModel>> GetByConditionAsync(Expression<Func<TMTN_PushMsgTo, bool>> expression)
        //{
        //    List<TMTN_PushMsgTo> pushMsgToList = DbContext.Set<TMTN_PushMsgTo>().Where(expression).AsEnumerable().ToList();
        //    List<TSYS_User> userList = DbContext.TSYS_User.ToList();
        //    var query = from a in pushMsgToList
        //                join b in userList
        //                on a.C_PushPersonCode equals b.C_UserID
        //                select new TmtnPushMsgToViewModel
        //                {
        //                    C_ID = a.C_ID,
        //                    C_DevStoreCode = a.C_DevStoreCode,
        //                    C_PushPersonCode = a.C_PushPersonCode,
        //                    C_MsgTypeCode = a.C_MsgTypeCode,
        //                    C_PushTypeCode = a.C_PushTypeCode,
        //                    C_PushPersonName = b.C_Name,

        //                };

        //    return query.ToList();
        //    //return Task.FromResult(DbContext.Set<T>().Where(expression).AsEnumerable());
        //}

    }
}