public void DoUpdate()
        {
            ClearDataGrid(Viewer.DataGridView_Update);
            if (!TryGetOutlookWrapper(out var ol))
            {
                throw new NullReferenceException("Cant get outlook.");
            }
            var extractor = new ResignInfoExtractor();
            var emailList = ol.GetItemInCurrentSelectedFolder("Vo Ya Phuong Khanh", "Luu Nhat Hong"); //test

            //var resignList = new List<Resignation>();
            //int notResignCount = 0;
            //int resignCount = 0;
            foreach (var mail in emailList)
            {
                //null = cant parse info
                //false = no info table found -> not resign letter
                var result = extractor.ExtractResignForm(mail.HTMLBody, out var resign, out var errorMess);
                if (result == ParseResult.Parsed_Info_Error)
                {
                    //error
                    //notResignCount++;
                    Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, errorMess, Code.E, GetAttentionColor);
                    continue;
                }
                if (result == ParseResult.OK)
                {
                    //ok
                    //resignList.Add(resign);
                    resign.ReceiveDate = mail.ReceivedTime;
                    var dbResult = Adapter.UpsertRecordIfNewer(resign, out var dbError);

                    switch (dbResult)
                    {
                    case DbResult.Insert:
                        Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, AddToDbSuccessful, Code.I, InfoColor);
                        break;

                    case DbResult.Update:
                        Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, UpdateToDbSuccessful, Code.I, InfoColor);
                        break;

                    case DbResult.Older:
                        Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, AddToDbOlderResignInfo, Code.I, InfoColor);
                        break;

                    case DbResult.Erorr:
                        Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, AddToDbFail + dbError, Code.E, GetAttentionColor);
                        break;

                    default:
                        throw new InvalidProgramException();
                    }
                    //resignCount++;
                }
                if (result == ParseResult.Not_Resign_Email)
                {
                    //notResignCount++;
                    Viewer.AddRecordToUpdateGrid(mail.Subject, mail.ReceivedTime, errorMess, Code.I, InfoColor);
                    //not resign email
                }
            }
        }
        public void DoUpdate(IEnumerable <MimeMessage> emailList)
        {
            var extractor = new ResignInfoExtractor();

            _logger.Log($"Parsing - total emails: {emailList.Count()}");
            foreach (var email in emailList)
            {
                var extractResult = extractor.ExtractResignForm(email.HtmlBody, out var resign, out var errorMess);
                if (extractResult == ParseResult.Parsed_Info_Error)
                {
                    //error
                    _logger.Log($"Parsing - {email.Subject}: form error -> {errorMess}");
                    UpdateResults.Add(MakeRow(email.Subject,
                                              email.Date.DateTime.ToString(DateStringFormat),
                                              string.Empty,
                                              errorMess,
                                              Code.E.ToString()));
                    //next email
                    continue;
                }
                if (extractResult == ParseResult.OK)
                {
                    resign.ReceiveDate = email.Date.DateTime;
                    var dbResult = Adapter.UpsertRecordIfNewer(resign, out var dbError);
                    switch (dbResult)
                    {
                    case DbResult.Insert:
                        Logic.IgnoreList.Add(resign);
                        UpdateResults.Add(MakeRow(email.Subject,
                                                  email.Date.DateTime.ToString(DateStringFormat),
                                                  resign.ResignDay.ToString(DateStringFormat),
                                                  dbResult.ToString(),
                                                  Code.I.ToString()));

                        break;

                    case DbResult.Update:
                        Logic.IgnoreList.Add(resign);
                        UpdateResults.Add(MakeRow(email.Subject,
                                                  email.Date.DateTime.ToString(DateStringFormat),
                                                  resign.ResignDay.ToString(DateStringFormat),
                                                  dbResult.ToString(),
                                                  Code.I.ToString()));
                        break;

                    case DbResult.Older:
                        UpdateResults.Add(MakeRow(email.Subject,
                                                  email.Date.DateTime.ToString(DateStringFormat),
                                                  string.Empty,
                                                  dbResult.ToString(),
                                                  Code.I.ToString()));
                        break;

                    case DbResult.Erorr:     //never seen this happens
                        UpdateResults.Add(MakeRow(email.Subject,
                                                  email.Date.DateTime.ToString(DateStringFormat),
                                                  string.Empty,
                                                  dbError,
                                                  Code.E.ToString()));
                        break;

                    default:
                        throw new InvalidProgramException();
                    }
                    _logger.Log($"Parsing - {email.Subject}: OK -> DB: {dbError}");
                }
                if (extractResult == ParseResult.Not_Resign_Email)
                {
                    _logger.Log($"Parsing - {email.Subject}: probly not resign email");
                    UpdateResults.Add(MakeRow(email.Subject,
                                              email.Date.DateTime.ToString(DateStringFormat),
                                              string.Empty,
                                              errorMess,
                                              Code.I.ToString()));
                }
            }
            //sort base on error mess
            UpdateResults.Sort((item1, item2) => string.Compare(item1.Last(), item2.Last(), StringComparison.Ordinal));
        }