Editor/Cabinet/ArchCabinetManifest.cs
using System;
using System.Collections.Generic;
using Sandbox;

namespace Sunless.Architecture;

public sealed class ArchCabinetManifest : ArchKindManifest<ArchCabinetPart> {
	public override ArchKind Kind => ArchKind.Cabinet;

	public override string Slot => "Cabinets";

	public override IEnumerable<Type> Hosts => new[] { typeof( ArchRoom ) };

	public override string Label => "Cabinets";

	public override string Glyph => "kitchen";

	public override string Subtool => ArchSubtools.Cabinet;

	public override int DirectRank => 10;

	public override ArchLayerStage Stage( object payload ) => ArchLayerStage.Fixture;

	public override IReadOnlyList<List<Vector2>> Loops( object payload ) {
		if ( payload is not ArchCabinetPart part ) {
			return Array.Empty<List<Vector2>>();
		}

		var reach = part.Facing * part.Reach;

		return new List<List<Vector2>>
		{
			new() { part.Start, part.End, part.End + reach, part.Start + reach }
		};
	}

	// Asked with no kit to reach the type through, so the TIER answers for the datum a wall unit would have read off
	// the counter below it - or every hanging run's outline is drawn lying on the floor.
	public override float Height( object payload, float fallback ) {
		if ( payload is not ArchCabinetPart part ) {
			return fallback;
		}

		if ( part.BaseHeight > 0.01f ) {
			return part.BaseHeight;
		}

		return part.Tier == CabinetTier.Hanging ? fallback + ArchCabinetShape.HungDatum : fallback;
	}
}