@namespace Oqtane.Modules.Admin.Profiles
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IProfileService ProfileService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer

<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
    <div class="container">
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="name" HelpText="The name of this profile item" ResourceKey="Name">Name: </Label>
            <div class="col-sm-9">
                <input id="name" class="form-control" @bind="@_name" maxlength="50" required />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="title" HelpText="The title of the profile item to display to the user" ResourceKey="Title">Title: </Label>
            <div class="col-sm-9">
                <input id="title" class="form-control" @bind="@_title" maxlength="50" required />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="description" HelpText="The help text displayed to the user for this profile item" ResourceKey="Description">Description: </Label>
            <div class="col-sm-9">
                <textarea id="description" class="form-control" @bind="@_description" rows="3" maxlength="256" required></textarea>
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="category" HelpText="The category of this profile item (for grouping)" ResourceKey="Category">Category: </Label>
            <div class="col-sm-9">
                <input id="category" class="form-control" @bind="@_category" maxlength="50" />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="order" HelpText="The index order of where this profile item should be displayed" ResourceKey="Order">Order: </Label>
            <div class="col-sm-9">
                <input id="order" class="form-control" @bind="@_vieworder" min="0" max="9999" type="number" required />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="length" HelpText="The max number of characters this profile item should accept (enter zero for unlimited)" ResourceKey="Length">Length: </Label>
            <div class="col-sm-9">
                <input id="length" class="form-control" @bind="@_maxlength" min="0" max="524288" type="number" required />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="rows" HelpText="The number of rows for text entry (one is the default)" ResourceKey="Rows">Rows: </Label>
            <div class="col-sm-9">
                <input id="rows" class="form-control" @bind="@_rows" min="1" max="10" type="number" required />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="defaultVal" HelpText="The default value for this profile item" ResourceKey="DefaultValue">Default Value: </Label>
            <div class="col-sm-9">
                <input id="defaultVal" class="form-control" @bind="@_defaultvalue" maxlength="2000" />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="options" HelpText="A comma delimited list of options the user can select from" ResourceKey="Options">Options: </Label>
            <div class="col-sm-9">
                <input id="options" class="form-control" @bind="@_options" maxlength="2000" />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="required" HelpText="Should a user be required to provide a value for this profile item?" ResourceKey="Required">Required? </Label>
            <div class="col-sm-9">
                <select id="required" class="form-select" @bind="@_isrequired" required>
                    <option value="True">@SharedLocalizer["Yes"]</option>
                    <option value="False">@SharedLocalizer["No"]</option>
                </select>
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="validation" HelpText="Optionally provide a regular expression (RegExp) for validating the value entered" ResourceKey="Validation">Validation: </Label>
            <div class="col-sm-9">
                <input id="validation" class="form-control" @bind="@_validation" maxlength="200" />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="autocomplete" HelpText="The HTML autocomplete attribute allows you to specify browser behavior for automated user assistance in filling out form field values. Allowable values are blank (default), 'on', 'off', or any value from the standardized taxonomy defined for this attribute." ResourceKey="Autocomplete">Autocomplete: </Label>
            <div class="col-sm-9">
                <input id="autocomplete" class="form-control" @bind="@_autocomplete" maxlength="30" />
            </div>
        </div>
        <div class="row mb-1 align-items-center">
            <Label Class="col-sm-3" For="private" HelpText="Should this profile item be visible to all users?" ResourceKey="Private">Private? </Label>
            <div class="col-sm-9">
                <select id="private" class="form-select" @bind="@_isprivate" required>
                    <option value="True">@SharedLocalizer["Yes"]</option>
                    <option value="False">@SharedLocalizer["No"]</option>
                </select>
            </div>
        </div>
    </div>
    <br />
    <button type="button" class="btn btn-success" @onclick="SaveProfile">@SharedLocalizer["Save"]</button>
    <NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
        @if (PageState.QueryString.ContainsKey("id"))
    {
        <br />
        <br />
        <AuditInfo CreatedBy="@createdby" CreatedOn="@createdon" ModifiedBy="@modifiedby" ModifiedOn="@modifiedon"></AuditInfo>
    }
</form>

@code {
    private int _profileid = -1;
    private ElementReference form;
    private bool validated = false;
    private string _name = string.Empty;
    private string _title = string.Empty;
    private string _description = string.Empty;
    private string _category = string.Empty;
    private string _vieworder = "0";
    private string _maxlength = "0";
    private string _rows = "1";
    private string _defaultvalue = string.Empty;
    private string _options = string.Empty;
    private string _validation = string.Empty;
    private string _autocomplete = string.Empty;
    private string _isrequired = "False";
    private string _isprivate = "False";
    private string createdby;
    private DateTime createdon;
    private string modifiedby;
    private DateTime modifiedon;

    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;

    public override string Actions => "Add,Edit";

    protected override async Task OnInitializedAsync()
    {
        try
        {
            if (PageState.QueryString.ContainsKey("id"))
            {
                _profileid = Int32.Parse(PageState.QueryString["id"]);
                var profile = await ProfileService.GetProfileAsync(_profileid);
                if (profile != null)
                {
                    _name = profile.Name;
                    _title = profile.Title;
                    _description = profile.Description;
                    _category = profile.Category;
                    _vieworder = profile.ViewOrder.ToString();
                    _maxlength = profile.MaxLength.ToString();
                    _rows = profile.Rows.ToString();
                    _defaultvalue = profile.DefaultValue;
                    _options = profile.Options;
                    _validation = profile.Validation;
                    _autocomplete = profile.Autocomplete;
                    _isrequired = profile.IsRequired.ToString();
                    _isprivate = profile.IsPrivate.ToString();
                    createdby = profile.CreatedBy;
                    createdon = profile.CreatedOn;
                    modifiedby = profile.ModifiedBy;
                    modifiedon = profile.ModifiedOn;
                }
            }
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Loading Profile {ProfileId} {Error}", _profileid, ex.Message);
            AddModuleMessage(Localizer["Error.Profile.Load"], MessageType.Error);
        }
    }

    private async Task SaveProfile()
    {
        validated = true;
        var interop = new Interop(JSRuntime);
        if (await interop.FormValid(form))
        {
            try
            {
                Profile profile;
                if (_profileid != -1)
                {
                    profile = await ProfileService.GetProfileAsync(_profileid);
                }
                else
                {
                    profile = new Profile();
                }

                profile.SiteId = PageState.Site.SiteId;
                profile.Name = _name;
                profile.Title = _title;
                profile.Description = _description;
                profile.Category = _category;
                profile.ViewOrder = int.Parse(_vieworder);
                profile.MaxLength = int.Parse(_maxlength);
                profile.Rows = int.Parse(_rows);
                profile.DefaultValue = _defaultvalue;
                profile.Options = _options;
                profile.Validation = _validation;
                profile.Autocomplete = _autocomplete;
                profile.IsRequired = (_isrequired == null ? false : Boolean.Parse(_isrequired));
                profile.IsPrivate = (_isprivate == null ? false : Boolean.Parse(_isprivate));

                if (_profileid != -1)
                {
                    profile = await ProfileService.UpdateProfileAsync(profile);
                }
                else
                {
                    profile = await ProfileService.AddProfileAsync(profile);
                }

                await logger.LogInformation("Profile Saved {Profile}", profile);
                NavigationManager.NavigateTo(NavigateUrl());
            }
            catch (Exception ex)
            {
                await logger.LogError(ex, "Error Saving Profile {ProfleId} {Error}", _profileid, ex.Message);
                AddModuleMessage(Localizer["Error.Profile.Save"], MessageType.Error);
            }
        }
        else
        {
            AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
        }
    }
}
