using Dapper;
using GB5Shared.DTO.Framework.Criteria;
namespace PayRollDAL.CustomeCode.Periodic
{
///
/// Builds a parameterized WHERE-fragment + DynamicParameters bag from a flattened CriteriaDTO,
/// mirroring GB4's PeriodicDAL.GetPeriodicandaddonCriteria* helpers (HQL-based ApplyCriteria)
/// without string-concatenating criteria VALUES into SQL — only column names are chosen per
/// map (fixed, code-controlled), values are always bound via @p{N} parameters.
///
public static class PeriodicCriteriaHelper
{
///
/// fieldToColumn: logical CriteriaDTO field name (case-insensitive) -> SQL column expression.
/// Only fields present in the map AND present in the parsed criteria produce a filter.
///
public static (string Filter, DynamicParameters Params) Build(
CriteriaDTO? criteriaDTO,
IReadOnlyDictionary fieldToColumn)
{
var parameters = new DynamicParameters();
if (criteriaDTO == null)
return ("", parameters);
var flat = CriteriaParser.Parse(criteriaDTO);
if (flat.Count == 0)
return ("", parameters);
var sb = new System.Text.StringBuilder();
int i = 0;
foreach (var kv in fieldToColumn)
{
if (!flat.TryGetValue(kv.Key, out var value) || value == null)
continue;
string paramName = $"CritP{i++}";
sb.Append(" AND ").Append(kv.Value).Append(" = @").Append(paramName);
parameters.Add(paramName, value);
}
return (sb.ToString(), parameters);
}
}
}