@using BTCPayServer.Client
@model BTCPayServer.Controllers.UIManageController.AuthorizeApiKeysViewModel

@{
    var displayName = Model.ApplicationName ?? Model.ApplicationIdentifier;
    var store = string.IsNullOrEmpty(Model.StoreId) ? null : Model.Stores.FirstOrDefault(s => s.Id == Model.StoreId);
    var permissions = Model.Permissions?.Split(';') ?? Array.Empty<string>();
    var groupedPermissions = Permission.ToPermissions(permissions).GroupBy(permission => permission.Policy);
    ViewData["Title"] = $"Authorize {displayName ?? "Application"}";
    Layout = "_LayoutWizard";
}

@section Navbar {
    @if (Model.NeedsStorePermission && store != null)
    {
        <form method="post" asp-action="AuthorizeAPIKey" class="back">
            <input type="hidden" asp-for="RedirectUrl" value="@Model.RedirectUrl"/>
            <input type="hidden" asp-for="Permissions" value="@Model.Permissions"/>
            <input type="hidden" asp-for="Strict" value="@Model.Strict"/>
            <input type="hidden" asp-for="ApplicationName" value="@Model.ApplicationName"/>
            <input type="hidden" asp-for="SelectiveStores" value="@Model.SelectiveStores"/>
            <input type="hidden" asp-for="ApplicationIdentifier" value="@Model.ApplicationIdentifier"/>
            <button name="command" type="submit" value="SelectStores" id="back">
                <vc:icon symbol="back"/>
            </button>
        </form>
    }
    <form method="post" asp-action="AuthorizeAPIKey" class="cancel">
        <button name="command" type="submit" value="Cancel" id="cancel">
            <vc:icon symbol="close"/>
        </button>
    </form>
}

<form method="post" asp-action="AuthorizeAPIKey">
    <input type="hidden" asp-for="RedirectUrl" value="@Model.RedirectUrl"/>
    <input type="hidden" asp-for="Permissions" value="@Model.Permissions"/>
    <input type="hidden" asp-for="Strict" value="@Model.Strict"/>
    <input type="hidden" asp-for="ApplicationName" value="@Model.ApplicationName"/>
    <input type="hidden" asp-for="SelectiveStores" value="@Model.SelectiveStores"/>
    <input type="hidden" asp-for="ApplicationIdentifier" value="@Model.ApplicationIdentifier"/>
    <header class="text-center">
        <h1>@ViewData["Title"]</h1>
        <p class="lead text-secondary mt-3">@(displayName ?? "An application") is requesting access to your BTCPay Server account.</p>
    </header>
    <div asp-validation-summary="All"></div>
    
    @if (Model.NeedsStorePermission && store == null)
    {
        @if (!Model.Stores.Any())
        {
            <div class="alert alert-warning mb-4">
                You currently have no stores configured.
            </div>
            <button class="btn btn-secondary" name="command" id="consent-no" type="submit" value="Cancel">Cancel</button>
        }
        else
        {
            <div class="form-group">
                <label asp-for="StoreId" class="form-label">Select the store to grant permission for</label>
                <select asp-for="StoreId" class="form-select" asp-items="@(new SelectList(Model.Stores, nameof(StoreData.Id), nameof(StoreData.StoreName)))" required></select>
                <span asp-validation-for="StoreId" class="text-danger"></span>
            </div>
            <div class="d-flex gap-3">
                <button class="btn btn-primary" name="command" id="continue" type="submit" value="SelectStores">Continue</button>
                <button class="btn btn-secondary" name="command" id="consent-no" type="submit" value="Cancel">Cancel</button>
            </div>
        }
    }
    else
    {
        <input type="hidden" asp-for="StoreId" class="form-select"/>
        
        @if (Model.RedirectUrl != null)
        {
            <p class="alert alert-info mb-4">
                If authorized, the generated API key will be provided to <strong>@Model.RedirectUrl.AbsoluteUri</strong>
            </p>
        }
        
        <div class="form-group">
            <label asp-for="Label" class="form-label"></label>
            <input asp-for="Label" class="form-control"/>
            <span asp-validation-for="Label" class="text-danger"></span>
        </div>
        
        <h2 class="h5 fw-semibold mt-4">Permissions</h2>
        @if (!groupedPermissions.Any())
        {
            <p>
                There are no associated permissions to the API key being requested by the application.
                The application cannot do anything with your BTCPay Server account other than validating your account exists.
            </p>
        }
        else
        {
            if (Model.NeedsStorePermission)
            {
                <p class="mb-2">
                    Store-based permissions will be applied for
                    <strong>@store.StoreName</strong>
                </p>
            }
            <div class="list-group list-group-flush mt-3">
                @for (var i = 0; i < Model.PermissionValues.Count; i++)
                {
                    <input type="hidden" asp-for="PermissionValues[i].Forbidden"/>
                    <input type="hidden" asp-for="PermissionValues[i].Permission"/>
                    <input type="hidden" asp-for="PermissionValues[i].StoreMode" value="@Model.PermissionValues[i].StoreMode"/>
                    @if (Model.PermissionValues[i].Forbidden && !Model.Strict)
                    {
                        continue;
                    }
                    <div class="list-group-item form-group">
                        <div class="form-check">
                            @if (Model.Strict || Model.PermissionValues[i].Forbidden)
                            {
                                <input id="@Model.PermissionValues[i].Permission" type="hidden" asp-for="PermissionValues[i].Value"/>
                                <input id="@Model.PermissionValues[i].Permission" type="checkbox" checked="@Model.PermissionValues[i].Value" class="form-check-input" disabled />
                            }
                            else
                            {
                                <input id="@Model.PermissionValues[i].Permission" type="checkbox" asp-for="PermissionValues[i].Value" class="form-check-input"/>
                            }
                            @* Wrapper div prevents the label to be muted in case of disabled checkbox (strict mode) *@
                            <div>
                                <label for="@Model.PermissionValues[i].Permission" class="form-check-label">@Model.PermissionValues[i].Title</label>
                            </div>
                            <div class="form-text">@Model.PermissionValues[i].Description</div>
                            <span asp-validation-for="PermissionValues[i].Value" class="text-danger"></span>
                            @if (Model.PermissionValues[i].Forbidden)
                            {
                                <div class="text-danger">This permission is not available for your account.</div>
                            }
                        </div>
                    </div>
                }
            </div>
        }
        <div class="d-flex gap-3">
            <button class="btn btn-primary" name="command" id="consent-yes" type="submit" value="Authorize">Authorize app</button>
            <button class="btn btn-secondary" name="command" id="consent-no" type="submit" value="Cancel">Cancel</button>
        </div>
    }
</form>