#pragma once

#include "CoreMinimal.h"
#include "Dom/JsonValue.h"
#include "Dom/JsonObject.h"

class FAssetHandlers
{
public:
	// Register all asset handlers
	static void RegisterHandlers(class FMCPHandlerRegistry& Registry);

private:
	// Handler implementations
	static TSharedPtr<FJsonValue> ListAssets(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SearchAssets(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReadAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReadAssetProperties(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> DuplicateAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RenameAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> MoveAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> DeleteAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> DeleteAssetBatch(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> BulkRename(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> CreateDataAsset(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SaveAsset(const TSharedPtr<FJsonObject>& Params);
	// #429: bulk save of every dirty package - one-shot end-of-workflow flush.
	static TSharedPtr<FJsonValue> SaveAllDirty(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ListTextures(const TSharedPtr<FJsonObject>& Params);

	// DataTable handlers
	static TSharedPtr<FJsonValue> CreateDataTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReadDataTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReimportDataTable(const TSharedPtr<FJsonObject>& Params);
	// #437: single-row append/update without re-serializing the whole table.
	static TSharedPtr<FJsonValue> SetDataTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RemoveDataTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> GetDataTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetDataTableCell(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RenameDataTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> FillDataTableFromJson(const TSharedPtr<FJsonObject>& Params);

	// CurveTable handlers
	static TSharedPtr<FJsonValue> CreateCurveTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReadCurveTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ImportCurveTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> AddCurveTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RemoveCurveTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RenameCurveTableRow(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> GetCurveTableKeys(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetCurveTableKeys(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> AddCurveTableKey(const TSharedPtr<FJsonObject>& Params);

	// FBX import handlers
	static TSharedPtr<FJsonValue> ImportStaticMesh(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ImportSkeletalMesh(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ImportAnimation(const TSharedPtr<FJsonObject>& Params);

	// Mesh material handlers
	static TSharedPtr<FJsonValue> SetMeshMaterial(const TSharedPtr<FJsonObject>& Params);

	// Mesh pivot handlers
	static TSharedPtr<FJsonValue> RecenterPivot(const TSharedPtr<FJsonObject>& Params);

	// Texture handlers
	static TSharedPtr<FJsonValue> ListTextureProperties(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetTextureProperties(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ImportTexture(const TSharedPtr<FJsonObject>& Params);
	// #430: one-call batch of texture imports - loops AssetImportTasks inside the editor.
	static TSharedPtr<FJsonValue> ImportTextureBatch(const TSharedPtr<FJsonObject>& Params);

	// StringTable handlers
	static TSharedPtr<FJsonValue> CreateStringTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReadStringTable(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ListStringTableKeys(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> GetStringTableEntry(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetStringTableEntry(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RemoveStringTableEntry(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ImportStringTable(const TSharedPtr<FJsonObject>& Params);

	// Export
	static TSharedPtr<FJsonValue> ExportAsset(const TSharedPtr<FJsonObject>& Params);

	// Reimport
	static TSharedPtr<FJsonValue> ReimportAsset(const TSharedPtr<FJsonObject>& Params);

	// Socket handlers
	static TSharedPtr<FJsonValue> AddSocket(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> RemoveSocket(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ListSockets(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetSocketTransform(const TSharedPtr<FJsonObject>& Params);

	// #420: nested-path UPROPERTY setter for any asset (materials, datatables,
	// data assets, etc.) so callers don't read-modify-write struct copies.
	static TSharedPtr<FJsonValue> SetAssetProperty(const TSharedPtr<FJsonObject>& Params);
	// #421: batch texture settings by canonical type (Normal/Grayscale/BaseColor/HDR).
	static TSharedPtr<FJsonValue> SetTextureSettingsByType(const TSharedPtr<FJsonObject>& Params);
	// #421: one-call factory for an Interchange pipeline asset with the
	// 15-property mesh-import boilerplate already configured.
	static TSharedPtr<FJsonValue> CreateInterchangePipeline(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReloadPackage(const TSharedPtr<FJsonObject>& Params);

	// v0.7.8 — FTS5-backed asset search (stubs)
	static TSharedPtr<FJsonValue> SearchAssetsFTS(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ReindexAssetsFTS(const TSharedPtr<FJsonObject>& Params);

	// v0.7.19 issue #150 — AssetRegistry referencers for a set of packages
	static TSharedPtr<FJsonValue> GetReferencers(const TSharedPtr<FJsonObject>& Params);

	// issue #588 — AssetRegistry forward dependencies for a set of packages
	static TSharedPtr<FJsonValue> GetDependencies(const TSharedPtr<FJsonObject>& Params);

	// issue #579 — AssetManager primary-asset-id enumeration / verification
	static TSharedPtr<FJsonValue> GetPrimaryAssetIds(const TSharedPtr<FJsonObject>& Params);

	// v1.0.0-rc.2 — #155 (asset gaps)
	static TSharedPtr<FJsonValue> SetSkeletalMeshMaterialSlots(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> DiagnoseRegistry(const TSharedPtr<FJsonObject>& Params);

	// v1.0.0-rc.3 — #177, #192, #193
	static TSharedPtr<FJsonValue> GetMeshBounds(const TSharedPtr<FJsonObject>& Params);
	// #431: one-call mesh QA - bounds + materials + LOD/vertex/skeleton.
	static TSharedPtr<FJsonValue> GetMeshInfo(const TSharedPtr<FJsonObject>& Params);
	// #593: list bones (names + rest-pose transforms) from a SkeletalMesh/Skeleton asset.
	static TSharedPtr<FJsonValue> ListSkeletonBones(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> GetMeshCollision(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> MoveFolder(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> SetMeshNav(const TSharedPtr<FJsonObject>& Params);
	// #212: create empty content browser folders
	static TSharedPtr<FJsonValue> CreateFolder(const TSharedPtr<FJsonObject>& Params);
	// Delete content browser folder(s) - empty by default; force=true also removes contained assets.
	static TSharedPtr<FJsonValue> DeleteFolder(const TSharedPtr<FJsonObject>& Params);
	// #270: read AssetImportData source filenames from imported assets
	static TSharedPtr<FJsonValue> ReadImportSources(const TSharedPtr<FJsonObject>& Params);

	// #279: detect stuck-unloadable assets and recover without editor restart
	static TSharedPtr<FJsonValue> HealthCheck(const TSharedPtr<FJsonObject>& Params);
	static TSharedPtr<FJsonValue> ForceReload(const TSharedPtr<FJsonObject>& Params);
};
