Items/SnowmanPiece.cs
using Clover.Interactable;
using Clover.Persistence;
using Clover.Player;
using Clover.Ui;

namespace Clover.Items;

public class SnowmanPiece : DecalItem, IInteract, IPersistent
{
	public enum SnowmanPieceType
	{
		Small,
		Medium,
		Large
	}

	[RequireComponent] public WorldItem WorldItem { get; private set; }

	[Property] public ModelRenderer ModelRenderer { get; set; }

	private SnowmanPieceType _type = SnowmanPieceType.Small;

	[Property]
	public SnowmanPieceType PieceType
	{
		get => _type;
		set
		{
			_type = value;
			if ( !ModelRenderer.IsValid() )
			{
				Log.Error( "ModelRenderer is not valid" );
				return;
			}

			var scale = _type switch
			{
				SnowmanPieceType.Small => 1f,
				SnowmanPieceType.Medium => 1.2f,
				SnowmanPieceType.Large => 1.4f,
				_ => 1f
			};

			ModelRenderer.LocalScale = Vector3.One * scale;
		}
	}

	public override void OnMaterialUpdate( Material material )
	{
		base.OnMaterialUpdate( material );

		if ( !ModelRenderer.IsValid() )
		{
			Log.Error( "ModelRenderer is not valid" );
			return;
		}

		// var baseMaterial = Material.Load( "items/seasonal/halloween/pumpkin_01/pumpkin_body.vmat" );
		/*var baseMaterial = PumpkinMaterial;

		if ( baseMaterial == null )
		{
			Log.Error( "Failed to load pumpkin material" );
			return;
		}

		var pumpkinMaterial = baseMaterial.CreateCopy();
		if ( pumpkinMaterial == null )
		{
			Log.Error( "Failed to create pumpkin material copy" );
			return;
		}*/

		var snowmanMaterial = Material.Create( $"snowman_{TexturePath}.vmat", "shaders/snowman.shader" );

		snowmanMaterial.Set( "Overlay", DecalTexture );


		snowmanMaterial.Attributes.Set( "paint", 1 );

		ModelRenderer.SetMaterialOverride( snowmanMaterial, "paint" );

		Log.Info( $"Snowman material updated, mat: {snowmanMaterial.ResourcePath}" );
	}

	public void StartInteract( PlayerCharacter player )
	{
		// MainUi.Instance.Components.Get<PaintUi>( true ).OpenPaint( PaintUi.PaintType.Pumpkin, 128, 64, true );
		if ( string.IsNullOrEmpty( TexturePath ) )
		{
			MainUi.Instance.Components.Get<PaintUi>( true ).OpenPaint( PaintUi.PaintType.Snowman, 128, 64, false );
		}
		else
		{
			MainUi.Instance.Components.Get<PaintUi>( true ).Open( TexturePath );
		}
	}

	public string GetInteractName()
	{
		return "Paint";
	}

	public override void OnSave( PersistentItem item )
	{
		base.OnSave( item );
		item.SetSaveData( "PieceType", (int)PieceType );
	}

	public override void OnLoad( PersistentItem item )
	{
		base.OnLoad( item );
		PieceType = (SnowmanPieceType)item.GetSaveData<int>( "PieceType" );
	}
}