@using Wave.Data
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using Wave.Utilities

@inject UserManager<ApplicationUser> UserManager
@inject NavigationManager Navigation
@inject IStringLocalizer<Wave.Components.Account.Pages.Manage.Index> Localizer
@inject IMessageDisplay Message

<ModalComponent Id="@ModalId">
	<ChildContent>
		<form id="add-user-link" @formname="add-user-link" @onsubmit="Add" method="post">
			<AntiforgeryToken />
			<InputLabelComponent LabelText="@Localizer["Links_Url_Label"]">
				<input class="input input-bordered" maxlength="512" autocomplete="off" type="url" 
				       oninput="charactersLeft_onInput(this)"
					   name="link-url" value="@Url" placeholder="@Localizer["Links_Url_Placeholder"]" />
			</InputLabelComponent>
		</form>
	</ChildContent>
	<Actions>
		<button form="add-user-link" type="submit" class="btn btn-primary">@Localizer["Links_Submit"]</button>
	</Actions>
</ModalComponent>

<ul class="flex flex-col gap-2 my-3">
	@foreach (var link in User.Links) {
		<li class="flex justify-between items-center">
			<UserLinkComponent Link="link" class="link flex gap-2" />
			<form @formname="@link.Id.ToString()" method="post" @onsubmit="Delete">
				<AntiforgeryToken />
				<input type="hidden" name="link-id" value="@link.Id" />
				<button type="submit" class="btn btn-square btn-error btn-sm" title="@Localizer["Links_Delete_Label"]">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
                        <path fill-rule="evenodd" d="M16.5 4.478v.227a48.816 48.816 0 0 1 3.878.512.75.75 0 1 1-.256 1.478l-.209-.035-1.005 13.07a3 3 0 0 1-2.991 2.77H8.084a3 3 0 0 1-2.991-2.77L4.087 6.66l-.209.035a.75.75 0 0 1-.256-1.478A48.567 48.567 0 0 1 7.5 4.705v-.227c0-1.564 1.213-2.9 2.816-2.951a52.662 52.662 0 0 1 3.369 0c1.603.051 2.815 1.387 2.815 2.951Zm-6.136-1.452a51.196 51.196 0 0 1 3.273 0C14.39 3.05 15 3.684 15 4.478v.113a49.488 49.488 0 0 0-6 0v-.113c0-.794.609-1.428 1.364-1.452Zm-.355 5.945a.75.75 0 1 0-1.5.058l.347 9a.75.75 0 1 0 1.499-.058l-.346-9Zm5.48.058a.75.75 0 1 0-1.498-.058l-.347 9a.75.75 0 0 0 1.5.058l.345-9Z" clip-rule="evenodd" />
                    </svg>
                </button>
			</form>
		</li>
	}
</ul>
<button class="btn btn-primary w-full" onclick="@(ModalId).showModal()">
	@Localizer["Links_Label"]
</button>

@code {
	private static string ModalId => "AddLinkDialog";

	[Parameter]
	public required ApplicationUser User { get; set; }
	
	// Create
	[SupplyParameterFromForm(FormName = "add-user-link", Name = "link-url"), MaxLength(512)]
	private string Url { get; set; } = string.Empty;

	// Delete
	[SupplyParameterFromForm(Name = "link-id")]
	private int? LinkId { get; set; }
	
	private async Task Add() {
		if (string.IsNullOrWhiteSpace(Url)) {
			Message.ShowError("Url is required.");
			return;
		}
		if (Url.Length > 512) {
			Message.ShowError("Url is too long.");
			return;
		}

		var link = new UserLink { UrlString = Url };
		if (!link.Validate()) {
			Message.ShowError("Url is invalid.");
			return;
		}

		link.UrlString = link.Url.AbsoluteUri;
		User.Links.Add(link);
		await UserManager.UpdateAsync(User);
		Url = string.Empty;
	}

	private async Task Delete() {
		var link = User.Links.FirstOrDefault(l => l.Id == LinkId);
		if (link is null) {
			Message.ShowError("Link ID not found.");
			return;
		}

		User.Links.Remove(link);
		await UserManager.UpdateAsync(User);
	}
}
