public List <SmsLog> GetSMSarray_AlertByRules(List <SmsLog> alerts)
        {
            List <SmsLog> result       = new List <SmsLog>();
            var           user_id_list = alerts.Select(x => x.AspNetUser_Id).Distinct().ToArray();

            //string[] user_id_list = new string[2] { "20595462-e9cd-40a7-81e9-08fc7fdbaa4c","cc5e12ee-54bd-47ef-88ce-7e8590432218" };

            string useridpar = "\'" + string.Join("\',\'", user_id_list) + "\'";

            using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
            {
                var phonesList = context.SMS_Get_PhonesListByUserID(useridpar).ToList();

                if (phonesList.Count > 0)
                {
                    foreach (var item in alerts)
                    {
                        var r = phonesList.Find(x => (x.AspNetUser_ID == item.AspNetUser_Id) && (x.Alert_Name == item.@event) &&
                                                x.phone.Trim() == item.phonenumber.Trim()
                                                );
                        if (r != null)
                        {
                            item.phonenumber = r.phone;
                            result.Add(item);
                        }
                    }
                }
            }

            return(result);
        }
        //Update sms status by FeedBack request
        internal void UpdateSMSstatus()
        {
            string param = string.Empty;

            //1. Request FeedBack status
            using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
            {
                var smslist = context.SmsLogs.Where(z => z.status == "accepted" || z.status == "queued" || z.status == "prepared to sending").Select(x => new
                {
                    clientId = x.id,
                    smscId   = x.smscId.Trim()
                }).ToList();

                param = (smslist.Count > 0) ? JsonConvert.SerializeObject(smslist) : "0";
            }
            if (param != "0")
            {
                string req_pass = "******"login\": \"" + Properties.Settings.Default.login +
                                  "\",\"password\": \"" + Properties.Settings.Default.password +
                                  "\", \"messages\": " + param + "}";

                FeedBackResponse fbr = HttpPostRequestStatus(req_pass);
                FB_StatusHandler(fbr);
            }
        }
        private void FB_StatusHandler(FeedBackResponse fbr)
        {
            //1. get messages list from FeedBack Responce
            List <messages> sms_fbr = new List <messages>();

            sms_fbr.AddRange(fbr.messages);
            int[] clientIdarr = sms_fbr.Select(x => x.clientId).ToArray();

            //2. Update records in database
            List <SmsLog> slxx = new List <SmsLog>();

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    slxx = context.SmsLogs.Where(x => clientIdarr.Contains(x.id)).ToList();
                    //Update status and smscid from FeedBack Response;
                    foreach (var item in slxx)
                    {
                        int client_Id = sms_fbr.Find(x => x.clientId == item.id).clientId;
                        if (item.id == client_Id)
                        {
                            item.status = sms_fbr.Find(x => x.clientId == item.id).status;
                            item.smscId = sms_fbr.Find(x => x.clientId == item.id).smscId;
                        }
                    }
                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                string x = ex.Message;
            }
        }
        // Read Alerts log Table
        public List <SmsLog> GetZ_AlertLogs()
        {
            List <SMS_GetZ_AlertLogsByDate_Result> result = new List <SMS_GetZ_AlertLogsByDate_Result>();
            List <SmsLog> sl = new List <SmsLog>();

            DateTime?dt = GetTorontoLocalDateTime();

            //DateTime? dt = DateTime.Parse("2020-08-5");

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    result = context.SMS_GetZ_AlertLogsByDate(dt.Value).ToList();
                }
                //remove record with Gaps > 5%
                if (result.Count > 0)
                {
                    result = RemoveBigGapsData(result, Properties.Settings.Default.GapsLimit);
                }
                else
                {
                    return(sl);
                }
            }
            catch (Exception ex)
            {
                throw;
            }
            //Write records to Smslog table database

            foreach (var item in result)
            {
                SmsLog slitem = new SmsLog();
                slitem.@event        = item.@event;
                slitem.message       = item.message;
                slitem.phonenumber   = item.Phone;
                slitem.status        = "prepared to sending";
                slitem.datemark      = item.date_emailsent;
                slitem.smscId        = "0";
                slitem.AspNetUser_Id = item.AspNetUser_ID;
                sl.Add(slitem);
                slitem = null;
            }

            //check if records were saved today
            var rdonetoday = RemoveItemsSaved(sl);

            return(rdonetoday);
        }
 // Write SMS log records
 public void WriteSmsLogs(List <SmsLog> smsLogs)
 {
     try
     {
         using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
         {
             context.SmsLogs.AddRange(smsLogs);
             context.SaveChanges();
         }
     }
     catch (Exception ex)
     {
         throw;
     }
 }
        private List <SmsLog> RemoveItemsSaved(List <SmsLog> sl)
        {
            List <SmsLog> sl_result = new List <SmsLog>();

            DateTime?dt = GetTorontoLocalDateTime().Date; //DateTime.Parse("2020-04-02"); //
            //DateTime? dt = DateTime.Parse("2020-08-05"); //

            DateTime?dt1 = dt.Value.Date.AddHours(24);

            List <SmsLog> rowex = new List <SmsLog>();

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    rowex = context.SmsLogs.Where(x => x.datemark >= dt.Value && x.datemark <= dt1.Value && x.status.Contains("delivered")).ToList();
                }
            }
            catch (Exception ex)
            {
                var x = ex.Message;
                throw;
            }
            //filter sl - remove old records
            //sl.RemoveAll(x => rowex.Any(r => r.AspNetUser_Id.Contains(x.AspNetUser_Id)
            //                                && x.@event == r.@event
            //                                && x.message == r.message
            //                                && x.phonenumber.Trim() == r.phonenumber.Trim()
            //                               ));
            //Harrcroft Acres. Warning Temperature stays over 40.5C for 6 hours. Cow 724 Dec 29 2020 12:28AM
            foreach (var item in sl)
            {
                string msgCow = item.message.Substring(0, item.message.Length - 19);
                var    xel    = rowex.Find(x => x.AspNetUser_Id.Contains(item.AspNetUser_Id) &&
                                           x.@event == item.@event &&
                                           x.phonenumber.Trim() == item.phonenumber.Trim() &&
                                           x.message.Contains(msgCow) &&
                                           x.status.Contains("delivered")
                                           );
                if (xel == null)
                {
                    sl_result.Add(item);
                }
            }
            return(sl_result);
        }
        //database managment-----------------------------------------------------
        private List <SMS_GetZ_AlertLogsByDate_Result> AlertsList()
        {
            List <SMS_GetZ_AlertLogsByDate_Result> results = new List <SMS_GetZ_AlertLogsByDate_Result>();
            DateTime?dt = GetTorontoLocalDateTime();

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    results = context.SMS_GetZ_AlertLogsByDate(dt.Value).ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return(results);
        }
        //FeedBack response after sending------------------------------------------
        public void FB_ResponseHandler(FeedBackResponse fbr)
        {
            //1. get messages list from FeedBack Responce
            List <messages> sms_fbr = new List <messages>();

            sms_fbr = fbr.messages;
            //sms_fbr.AddRange(fbr.messages);

            //2. Update records in database
            List <SmsLog> slxx = new List <SmsLog>();

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    slxx = context.SmsLogs.Where(x => x.status == "prepared to sending" && x.smscId == "0").ToList();
                    //Update status and smscid from FeedBack Response;
                    foreach (var item in slxx)
                    {
                        int client_Id = (sms_fbr.Count > 1) ? sms_fbr.Where(x => x.clientId == item.id).SingleOrDefault().clientId : sms_fbr[0].clientId;
                        if (item.id == client_Id)
                        {
                            item.status = (sms_fbr.Count > 1) ? sms_fbr.Where(x => x.clientId == item.id).SingleOrDefault().status : sms_fbr[0].status;
                            item.smscId = (sms_fbr.Count > 1) ? sms_fbr.Where(x => x.clientId == item.id).SingleOrDefault().smscId : sms_fbr[0].smscId;
                        }
                    }
                    foreach (var item in slxx)
                    {
                        if (item.smscId.Trim() == "0")
                        {
                            item.status = slxx.Where(x => x.phonenumber == item.phonenumber && x.smscId.Trim() != "0").SingleOrDefault().status;
                            item.smscId = slxx.Where(x => x.phonenumber == item.phonenumber && x.smscId.Trim() != "0").SingleOrDefault().smscId.ToString();
                        }
                    }
                    //context.SmsLogs.AddRange(sl);
                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                string x = ex.Message;
            }
        }
        public bool WriteRecord(Log item)
        {
            bool result = false;

            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    item.datestamp = GetTorontoLocalDateTime();// DateTime.Now;
                    context.Logs.Add(item);
                    // executes the commands to implement the changes to the database
                    context.SaveChanges();
                    result = true;
                }
            }
            catch (Exception ex)
            {
                SendEmail("*****@*****.**", "*****@*****.**", ex.Message + ex.InnerException.Message, "LogWriter");
            }
            return(result);
        }
        private static List <SmsLog> SaveSMSinDatabase(List <SmsLog> alerts_ruled)
        {
            List <SmsLog> sl = new List <SmsLog>();

            foreach (var item in alerts_ruled)
            {
                SmsLog slitem = new SmsLog();
                slitem.@event        = item.@event;
                slitem.message       = item.message;
                slitem.phonenumber   = item.phonenumber;
                slitem.status        = "prepared to sending";
                slitem.datemark      = item.datemark;
                slitem.smscId        = "0";
                slitem.AspNetUser_Id = item.AspNetUser_Id;
                sl.Add(slitem);
                slitem = null;
            }
            //update database
            try
            {
                using (DB_A4A060_csEntities context = new DB_A4A060_csEntities())
                {
                    context.SmsLogs.AddRange(sl);
                    context.SaveChanges();
                    int rowsnumber = sl.Count;
                    sl.Clear();
                    sl = context.SmsLogs.OrderByDescending(x => x.id).Where(x => x.status == "prepared to sending" && x.smscId == "0").Take(rowsnumber).ToList();
                }
            }
            catch (Exception ex)
            {
                var x = ex.Message;
                sl = null;
            }
            return(sl);
        }