private InspectionsStatusCode ProcessLineIntoDetailsAsDetailOrError(ExcelWorksheet keyWorksheet,
                                                                            SpreadsheetDetails spreadsheetDetails,
                                                                            int lineNumber,
                                                                            ICollection <InspectionOutcome> inspections, ICollection <InspectionError> errorSet)
        {
            var error = new InspectionError {
                LineNumber = lineNumber
            };

            var ukprn = ProcessUkprnForError(Convert.ToString(keyWorksheet.Cells[lineNumber, spreadsheetDetails.UkPrnColumn].Value), error);
            var url   = _processExcelFormulaToLink.GetLinkFromFormula(
                keyWorksheet.Cells[lineNumber, spreadsheetDetails.WebLinkColumn].Formula,
                keyWorksheet.Cells[lineNumber, spreadsheetDetails.WebLinkColumn].Text);
            var overallEffectiveness = ProcessOverallEffectivenessForError(Convert.ToString(keyWorksheet.Cells[lineNumber, spreadsheetDetails.OverallEffectivenessColumn]?.Value), error);
            var datePublished        = ProcessDatePublishedForError(keyWorksheet.Cells[lineNumber, spreadsheetDetails.DatePublishedColumn], error);

            if (ukprn != null && overallEffectiveness != null && datePublished != null)
            {
                AddInspectionData((int)ukprn, url, datePublished, (OverallEffectiveness)overallEffectiveness,
                                  inspections);
                _logger.Debug($"Details processed successfully for line {lineNumber}: {ukprn}, {url}, {error.DatePublished}, {overallEffectiveness}");
                return(InspectionsStatusCode.Success);
            }

            error.Website = url ?? string.Empty;

            errorSet.Add(error);
            _logger.Warn($"Details processed unsuccessfully for line {error.LineNumber}: '{error.Ukprn}', '{error.Website}', '{error.DatePublished}', '{error.OverallEffectiveness}'");
            return(InspectionsStatusCode.ProcessedWithErrors);
        }
        private static int?ProcessUkprnForError(string value, InspectionError error)
        {
            var ukprnString = value ?? string.Empty;

            error.Ukprn = ukprnString;
            int ukprn;

            if (int.TryParse(ukprnString, out ukprn))
            {
                return(ukprn);
            }

            error.Message = error.Message + $@"Invalid value for ukprn [{error.Ukprn = ukprnString}]; ";
            return(null);
        }
        private static DateTime?ProcessDatePublishedForError(ExcelRange cell,
                                                             InspectionError error)
        {
            var datePublished = GetDateTimeValue(cell);

            if (datePublished != null)
            {
                error.DatePublished = datePublished == DateTime.MinValue ? "NULL" : datePublished.ToDdmmyyyyString();
            }
            else
            {
                error.DatePublished = cell.Text;
                error.Message       = error.Message + $@"Invalid value for Date Published [{error.DatePublished}]; ";
            }

            return(datePublished);
        }
        private OverallEffectiveness?ProcessOverallEffectivenessForError(string value, InspectionError error)
        {
            var overallEffectivenessString = value;
            var overallEffectiveness       = _overallEffectivenessProcessor.GetOverallEffectiveness(overallEffectivenessString);

            error.OverallEffectiveness = overallEffectivenessString;
            if (overallEffectiveness == null)
            {
                error.Message = error.Message + $@"Invalid value for Overall Effectiveness [{ error.OverallEffectiveness}]; ";
            }
            return(overallEffectiveness);
        }