using ClosedXML.Excel;
using JdeScoping.ExcelIO.Configuration;
using JdeScoping.ExcelIO.Formatting;
using JdeScoping.ExcelIO.Models.Reporting;
using Microsoft.Extensions.Options;
namespace JdeScoping.ExcelIO.Generators;
///
/// Generates the Search Criteria sheet for Excel export.
///
public class CriteriaSheetGenerator
{
private readonly IOptions _options;
private readonly AttributeTableWriter _tableWriter;
///
/// Initializes a new instance of the CriteriaSheetGenerator class.
///
/// Excel export options.
/// Attribute table writer.
public CriteriaSheetGenerator(
IOptions options,
AttributeTableWriter tableWriter)
{
_options = options;
_tableWriter = tableWriter;
}
///
/// Generates the Search Criteria sheet.
///
/// The workbook to add the sheet to.
/// The search model with criteria.
public void Generate(XLWorkbook workbook, SearchModel search)
{
var worksheet = workbook.Worksheets.Add("Search Criteria");
var row = 1;
// Write name and user
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(row, 1), "Search Name");
worksheet.Cell(row, 2).Value = search.Name;
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "User Name");
worksheet.Cell(row, 2).Value = search.UserName;
// Skip row
row++;
// Write timestamps
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Submit timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.SubmitDt);
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Start timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.StartDt);
HeaderFormatter.ApplyHeaderFormat(worksheet.Cell(++row, 1), "Completed timestamp");
worksheet.Cell(row, 2).Value = FormatTimestamp(search.EndDt);
// Skip row
row++;
// Write timespan filter table
var timespanData = new List
{
new() { MinimumDt = search.MinimumDt, MaximumDt = search.MaximumDt }
};
var timespanTable = _tableWriter.WriteTable(worksheet, ++row, 1, timespanData);
if (timespanTable != null)
{
row = timespanTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write work order filter table
var workOrderTable = _tableWriter.WriteTable(worksheet, row, 1, search.WorkOrderFilter);
if (workOrderTable != null)
{
row = workOrderTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write item number filter table
var itemNumberTable = _tableWriter.WriteTable(worksheet, row, 1, search.ItemNumberFilter);
if (itemNumberTable != null)
{
row = itemNumberTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write profit center filter table
var profitCenterTable = _tableWriter.WriteTable(worksheet, row, 1, search.ProfitCenterFilter);
if (profitCenterTable != null)
{
row = profitCenterTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write work center filter table
var workCenterTable = _tableWriter.WriteTable(worksheet, row, 1, search.WorkCenterFilter);
if (workCenterTable != null)
{
row = workCenterTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write component lot filter table
var componentLotTable = _tableWriter.WriteTable(worksheet, row, 1, search.ComponentLotFilter);
if (componentLotTable != null)
{
row = componentLotTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write operator filter table
var operatorTable = _tableWriter.WriteTable(worksheet, row, 1, search.OperatorFilter);
if (operatorTable != null)
{
row = operatorTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write item/operation/MIS filter table
var itemOpMisTable = _tableWriter.WriteTable(worksheet, row, 1, search.ItemOperationMisFilter);
if (itemOpMisTable != null)
{
row = itemOpMisTable.RangeAddress.LastAddress.RowNumber + 3;
}
else
{
row += 4;
}
// Write extract MIS data option
var headerRange = worksheet.Range(row, 1, row, 2);
HeaderFormatter.ApplyHeaderFormat(headerRange, "Extract MIS data?", merge: true);
worksheet.Cell(++row, 1).Value = search.ExtractMisData ? "YES" : "NO";
// Auto-fit columns with 15% padding
for (var column = 1; column <= 4; column++)
{
worksheet.Column(column).AdjustToContents();
worksheet.Column(column).Width *= ExcelFormats.CriteriaPaddingFactor;
}
// Apply protection
WorksheetProtector.ApplyCriteriaProtection(worksheet, _options.Value.CriteriaSheetPassword);
}
private static string FormatTimestamp(DateTime? dateTime)
{
if (!dateTime.HasValue)
{
return string.Empty;
}
return $"{dateTime.Value:MMM dd, yyyy hh:mm:ss tt} EST";
}
}