using System;
namespace GitConverter.Lib.Models
{
///
/// Helper methods for working with .
///
///
/// Responsibilities
/// - Provide the canonical dot-prefixed filename extension for a given
/// via .
/// - Resolve common user-facing converter option strings to values
/// via (case-insensitive).
///
/// Recommended usage pattern (converters & callers)
/// 1. Map the requested target option to the enum:
/// var fe = FileExtensionHelpers.FromOption(optionString);
/// 2. Obtain the suffix:
/// var suffix = fe.HasValue ? fe.Value.ToDotExtension() : FileExtension.Csv.ToDotExtension();
/// 3. Compose a deterministic output filename:
/// var outPath = Path.Combine(outputFolder, $"output_{timestamp}{suffix}");
///
/// Why this pattern
/// - It centralizes filename-suffix decisions so changing a canonical extension (for example
/// switching FileGdb to use ".gdb") only needs one code change.
/// - It reduces accidental inconsistencies and makes tests and documentation easier to keep in sync.
///
/// Behavior & guarantees
/// - The mapping implemented by is the single source
/// of truth for file suffixes used by converters when composing output file names.
/// - Helpers are pure, stateless and thread-safe.
///
/// Testing guidance
/// - Add unit tests that assert:
/// - Each enum member returns the expected dot-prefixed extension from .
/// - recognizes common option strings case-insensitively and returns null for unknown strings.
///
public static class FileExtensionHelpers
{
public static string ToDotExtension(this FileExtension ext)
{
switch (ext)
{
case FileExtension.Csv: return ".csv";
case FileExtension.EsriJson: return ".json";
case FileExtension.FileGdb: return ".gdb";
case FileExtension.GeoJson: return ".json";
case FileExtension.GeoJsonSeq: return ".json";
case FileExtension.GeoPackage: return ".gpkg";
case FileExtension.Gml: return ".gml";
case FileExtension.Gpx: return ".gpx";
case FileExtension.Kml: return ".kml";
case FileExtension.Kmz: return ".kmz";
case FileExtension.MapInfoInterchange: return ".mif";
case FileExtension.MapInfoTab: return ".tab";
case FileExtension.Osm: return ".osm";
case FileExtension.Shapefile: return ".shp";
case FileExtension.TopoJson: return ".json";
default: return string.Empty;
}
}
public static FileExtension? FromOption(string option)
{
if (string.IsNullOrWhiteSpace(option)) return null;
switch (option.Trim().ToLowerInvariant())
{
case "csv": return FileExtension.Csv;
case "esrijson": return FileExtension.EsriJson;
case "gdb":
case "gdbtable":
case "gdbtablx":
return FileExtension.FileGdb;
case "geojson": return FileExtension.GeoJson;
case "jsonl":
case "ndjson":
return FileExtension.GeoJsonSeq;
case "gpkg": return FileExtension.GeoPackage;
case "gml": return FileExtension.Gml;
case "gpx": return FileExtension.Gpx;
case "kml": return FileExtension.Kml;
case "kmz": return FileExtension.Kmz;
case "mif":
case "mid": return FileExtension.MapInfoInterchange;
case "tab":
case "dat":
case "map":
case "id":
return FileExtension.MapInfoTab;
case "osm": return FileExtension.Osm;
case "shp":
case "shx":
case "dbf":
return FileExtension.Shapefile;
case "topojson": return FileExtension.TopoJson;
default: return null;
}
}
}
}