UI/MagicScreen.razor
@using System;
@using Sandbox;
@using Sandbox.UI;

@* The magic shop: learn spells, or enchant your weapon. The wizard stands in the 3D shop. *@
<root class="screen">
	<div class="bubble">@Speech</div>

	<div class="parchment board">
		<div class="slot-tabs">
			<div class="tab @(Tab == 0 ? "active" : "")" onclick=@(() => { Tab = 0; speech = null; StateHasChanged(); })>spells</div>
			<div class="tab @(Tab == 1 ? "active" : "")" onclick=@(() => { Tab = 1; speech = null; StateHasChanged(); })>enchant</div>
		</div>

		@if ( Tab == 0 )
		{
			<div class="heading">@($"Your magicka: {P.Magicka}")</div>
			<div class="spells">
				@foreach ( var sp in Catalog.Spells )
				{
					var s = sp;
					bool known = P.Spells.Contains( (int)s.Id );
					bool locked = !known && P.Magicka < s.MinMagicka;
					<div class="spell @(known ? "known" : "") @(locked ? "locked" : "") @(PickedSpell == s.Id ? "picked" : "")" onclick=@(() => PickSpell( s ))>
						<div class="icon" style="background-image: url('resources/sad/ss/ui/@(s.Icon).png')"></div>
						<div class="name">@s.Name</div>
						<div class="price">@(known ? "known" : $"{Gm.Price( s.Price )}g")</div>
					</div>
				}
			</div>
			@if ( PickedSpell.HasValue && !P.Spells.Contains( (int)PickedSpell.Value ) )
			{
				<div class="btn" onclick=@BuySpell>@($"learn for {Gm.Price( Catalog.SpellInfo( PickedSpell.Value ).Price )} gold")</div>
			}
		}
		else
		{
			<div class="heading">Select enchant type</div>
			<div class="choices">
				@foreach ( var e in Types )
				{
					var type = e;
					<div class="choice @(Type == type ? "picked" : "")" onclick=@(() => { Type = type; speech = null; StateHasChanged(); })>
						<div class="icon" style="background-image: url('resources/sad/ss/ui/@(Catalog.EnchantIcon( type )).png')"></div>
						<div class="name">@type</div>
					</div>
				}
			</div>

			<div class="heading">Select enchant potency</div>
			<div class="choices">
				@for ( int t = 1; t <= 3; t++ )
				{
					var tier = t;
					<div class="choice tier @(Tier == tier ? "picked" : "")" onclick=@(() => { Tier = tier; speech = null; StateHasChanged(); })>
						<div class="name big">@(new string( 'I', tier ))</div>
						<div class="name">@(Catalog.EnchantTierName( tier ))</div>
					</div>
				}
			</div>

			<div class="summary">
				<div class="line">@($"{Weapon.Name} ({Weapon.Min}-{Weapon.Max})")</div>
				<div class="line">@CurrentText</div>
				@if ( Type != Enchant.None && Tier > 0 )
				{
					<div class="line strong">@($"{Catalog.EnchantTierName( Tier )} enchant: +{Catalog.EnchantRange( Tier ).Min}-{Catalog.EnchantRange( Tier ).Max} {Type.ToString().ToLower()} damage")</div>
					<div class="btn" onclick=@BuyEnchant>@($"enchant for {Gm.Price( Catalog.EnchantPrice( Tier ) )} gold")</div>
				}
			</div>
		}
	</div>

	<div class="gold-bar"><div class="coin"></div>@P.Gold</div>
	<div class="sas-round cross close" onclick=@(() => Gm.Go( GameScreen.Town ))><div class="mark"></div></div>
</root>

@code
{
	static readonly Enchant[] Types = { Enchant.Bleed, Enchant.Poison, Enchant.Death, Enchant.Freeze };

	GameManager Gm => GameManager.Instance;
	Profile P => Profile.Current;
	WeaponDef Weapon => Catalog.Weapons[P.Weapon];

	int Tab;
	Spell? PickedSpell;
	Enchant Type = Enchant.None;
	int Tier;
	string speech;

	string Speech
	{
		get => speech ?? (Tab == 0 ? "Magic, my friend. The more magicka in your head, the mightier the spells you can learn." : P.Weapon > 0 ? "Do you wish to enchant this weapon?" : "Bring me a weapon and I'll fill it with magic.");
		set => speech = value;
	}

	string CurrentText
	{
		get
		{
			var e = P.EnchantFor( P.Weapon );
			if ( e is null ) return "No enchantment yet.";
			var (min, max) = Catalog.EnchantRange( e.Tier );
			return $"Currently: {Catalog.EnchantTierName( e.Tier )} {e.Type.ToString().ToLower()} (+{min}-{max})";
		}
	}

	void PickSpell( SpellDef s )
	{
		PickedSpell = s.Id;
		Speech = $"{s.Name} ({s.Cost} magicka)\n{s.Help}" + (P.Magicka < s.MinMagicka ? $"\nNeeds {s.MinMagicka} magicka." : "");
		StateHasChanged();
	}

	void BuySpell()
	{
		if ( !PickedSpell.HasValue ) return;
		Speech = Gm.BuySpell( PickedSpell.Value );
		StateHasChanged();
	}

	void BuyEnchant()
	{
		Speech = Gm.BuyEnchant( Type, Tier );
		StateHasChanged();
	}

	protected override int BuildHash() => HashCode.Combine( Tab, PickedSpell, Type, Tier, speech, P?.Gold, P?.Weapon, HashCode.Combine( P?.Enchants.Count, P?.Spells.Count ) );
}