Editor/CitizenRetarget/RetargetFileDialogs.cs
namespace Editor.CitizenRetarget;

internal static class RetargetFileDialogs
{
	public static string PickExistingFile( string title, string extension, string currentPath, string fallbackDirectory )
	{
		extension = extension.Trim().TrimStart( '.' );
		var defaultPath = BuildDefaultFilePath( currentPath, fallbackDirectory, extension );
		var dialog = new FileDialog( null )
		{
			Title = title,
			Directory = ResolveInitialDirectory( currentPath, fallbackDirectory ),
			DefaultSuffix = $".{extension}"
		};
		dialog.SelectFile( Path.GetFileName( defaultPath ) );
		dialog.SetFindExistingFile();
		dialog.SetModeOpen();
		dialog.SetNameFilter( $"{extension.ToUpperInvariant()} (*.{extension})" );

		return dialog.Execute() ? dialog.SelectedFile : null;
	}

	public static string PickDirectory( string title, string currentPath, string fallbackDirectory )
	{
		var dialog = new FileDialog( null )
		{
			Title = title,
			Directory = ResolveInitialDirectory( currentPath, fallbackDirectory )
		};
		dialog.SetFindDirectory();
		dialog.SetModeOpen();

		return dialog.Execute() ? dialog.SelectedFile : null;
	}

	public static string SaveZipFile( string title, string defaultPath )
	{
		var selected = EditorUtility.SaveFileDialog( title, "zip", EnsureExtension( defaultPath, ".zip" ) );
		return string.IsNullOrWhiteSpace( selected ) ? null : EnsureExtension( selected, ".zip" );
	}

	private static string BuildDefaultFilePath( string currentPath, string fallbackDirectory, string extension )
	{
		var normalizedCurrent = NormalizePath( currentPath );
		if ( !string.IsNullOrWhiteSpace( normalizedCurrent ) && File.Exists( normalizedCurrent ) )
			return normalizedCurrent;

		var directory = ResolveInitialDirectory( currentPath, fallbackDirectory );
		return Path.Combine( directory, $"untitled.{extension}" );
	}

	private static string ResolveInitialDirectory( string currentPath, string fallbackDirectory )
	{
		var normalizedCurrent = NormalizePath( currentPath );
		if ( !string.IsNullOrWhiteSpace( normalizedCurrent ) )
		{
			if ( Directory.Exists( normalizedCurrent ) )
				return normalizedCurrent;

			var parent = Path.GetDirectoryName( normalizedCurrent );
			if ( !string.IsNullOrWhiteSpace( parent ) && Directory.Exists( parent ) )
				return parent;
		}

		var normalizedFallback = NormalizePath( fallbackDirectory );
		if ( !string.IsNullOrWhiteSpace( normalizedFallback ) && Directory.Exists( normalizedFallback ) )
			return normalizedFallback;

		return Environment.GetFolderPath( Environment.SpecialFolder.MyDocuments );
	}

	private static string EnsureExtension( string path, string extension )
	{
		if ( string.IsNullOrWhiteSpace( path ) )
			return path;

		return Path.GetExtension( path ).Equals( extension, StringComparison.OrdinalIgnoreCase )
			? path
			: path + extension;
	}

	private static string NormalizePath( string path )
	{
		return CitizenRetargetPaths.DecodeExternalPath( path ?? string.Empty ).Trim().Trim( '"' );
	}
}