Editor/Infrastructure/TailBoxEditorProject.cs
using System;
using System.Collections.Generic;

namespace Sandbox.TailBox;

public static class TailBoxEditorProject
{
	public static string GetConfigPath( string projectRoot )
	{
		return TailBoxProjectFileSystem.GetConfigPath( projectRoot );
	}

	public static bool ConfigExists( string projectRoot )
	{
		return TailBoxProjectFileSystem.ConfigExists( projectRoot );
	}

	public static TailBoxConfig LoadConfig( string projectRoot )
	{
		return TailBoxProjectFileSystem.LoadConfig( projectRoot );
	}

	public static TailBoxConfig SaveDefaultConfig( string projectRoot )
	{
		var config = TailBoxConfig.CreateDefault();
		SaveConfig( projectRoot, config );
		return config;
	}

	public static void SaveConfig( string projectRoot, TailBoxConfig config )
	{
		TailBoxProjectFileSystem.SaveConfig( projectRoot, config );
	}

	public static TailBoxGenerationResult Generate( string projectRoot, bool writeFile = true )
	{
		var root = TailBoxProjectFileSystem.NormalizeProjectRoot( projectRoot );
		var config = LoadConfig( root );
		return Generate( root, config, writeFile );
	}

	public static TailBoxGenerationResult Generate( string projectRoot, TailBoxConfig config, bool writeFile = true )
	{
		var root = TailBoxProjectFileSystem.NormalizeProjectRoot( projectRoot );
		config ??= TailBoxConfig.CreateDefault();
		var outputPath = ResolveOutputPath( root, config );
		var sourceFiles = TailBoxProjectFileSystem.FindContentFiles( root, config, outputPath );
		var sources = TailBoxProjectFileSystem.ReadSources( sourceFiles );

		var result = new TailBoxGenerator().GenerateFromSources( sources, config, root, outputPath );
		var wroteFile = false;
		if ( writeFile )
			wroteFile = TailBoxProjectFileSystem.WriteIfChanged( outputPath, result.GeneratedScss );

		return WithWriteState( result, wroteFile );
	}

	public static IReadOnlyCollection<string> FindContentFiles( string projectRoot, TailBoxConfig config )
	{
		var root = TailBoxProjectFileSystem.NormalizeProjectRoot( projectRoot );
		return TailBoxProjectFileSystem.FindContentFiles( root, config, ResolveOutputPath( root, config ) );
	}

	public static string ResolveOutputPath( string projectRoot, TailBoxConfig config )
	{
		return TailBoxProjectFileSystem.ResolveOutputPath( projectRoot, config );
	}

	private static TailBoxGenerationResult WithWriteState( TailBoxGenerationResult result, bool wroteFile )
	{
		return new TailBoxGenerationResult
		{
			ProjectRoot = result.ProjectRoot,
			OutputPath = result.OutputPath,
			GeneratedScss = result.GeneratedScss,
			ScannedFileCount = result.ScannedFileCount,
			DiscoveredClassCount = result.DiscoveredClassCount,
			WroteFile = wroteFile,
			GeneratedClasses = result.GeneratedClasses,
			SkippedClasses = result.SkippedClasses,
			Skipped = result.Skipped,
			Warnings = result.Warnings
		};
	}

	public static bool ShouldSkipPath( string projectRoot, string outputPath, string changedPath )
	{
		return TailBoxProjectFileSystem.ShouldSkipPath( projectRoot, outputPath, changedPath );
	}
}