using Core.Notes; namespace Core.Parsers; /// /// Builds a starter CSV for /students/import with roster columns plus leftover note fields. /// public static class StudentImportCsvTemplate { public static readonly string[] RosterHeaders = [ "Student Name", "Grade", "TSA year", "State ID", "Regional ID", "National ID" ]; /// /// Returns a CSV with a header row and one example data row. /// public static string Build(IEnumerable? leftoverFieldNames = null) { List leftovers = leftoverFieldNames? .Where(name => !string.IsNullOrWhiteSpace(name)) .Select(name => name.Trim()) .Where(name => !StudentNotesFieldParser.IsReservedHeader(name)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList() ?? []; if (leftovers.Count == 0) leftovers = [.. StudentNoteFieldDefaults.IndexColumns]; var headers = RosterHeaders.Concat(leftovers).ToArray(); var values = headers.Select(ExampleValue).ToArray(); return $"{ToCsvRow(headers)}{Environment.NewLine}{ToCsvRow(values)}{Environment.NewLine}"; } private static string ExampleValue(string header) => header switch { "Student Name" => "Last, First", "Grade" => "9", "TSA year" => "1st", "Interview Time" => "3:20-3:35", _ when ContainsIgnoreCase(header, "Application") || ContainsIgnoreCase(header, "Permission") => "x", _ => string.Empty }; private static bool ContainsIgnoreCase(string value, string part) => value.Contains(part, StringComparison.OrdinalIgnoreCase); private static string ToCsvRow(IEnumerable cells) => string.Join(",", cells.Select(EscapeCsv)); private static string EscapeCsv(string value) { if (value.Contains(',') || value.Contains('"') || value.Contains('\n')) return $"\"{value.Replace("\"", "\"\"")}\""; return value; } }