@using Oqtane.Modules.Controls
@using [Owner].Module.[Module].Services
@using [Owner].Module.[Module].Models

@namespace [Owner].Module.[Module]
@inherits ModuleBase
@inject I[Module]Service [Module]Service
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Edit> Localizer

<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="Enter a name" ResourceKey="Name">Name: </Label>
            <div class="col-sm-9">
                <input id="name" class="form-control" @bind="@_name" required />
            </div>
        </div>
    </div>
    <button type="button" class="btn btn-success" @onclick="Save">@Localizer["Save"]</button>
    <NavLink class="btn btn-secondary" href="@NavigateUrl()">@Localizer["Cancel"]</NavLink>
    <br /><br />
    @if (PageState.Action == "Edit")
    {
    <AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo>
    }
</form>

@code {
    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;

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

    public override string Title => "Manage [Module]";

    public override List<Resource> Resources => new List<Resource>()
    {
        new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }
    };

    private ElementReference form;
    private bool validated = false;

    private int _id;
    private string _name;
    private string _createdby;
    private DateTime _createdon;
    private string _modifiedby;
    private DateTime _modifiedon;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            if (PageState.Action == "Edit")
            {
                _id = Int32.Parse(PageState.QueryString["id"]);
                [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId);
                if ([Module] != null)
                {
                    _name = [Module].Name;
                    _createdby = [Module].CreatedBy;
                    _createdon = [Module].CreatedOn;
                    _modifiedby = [Module].ModifiedBy;
                    _modifiedon = [Module].ModifiedOn;
                }
            }
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Loading [Module] {[Module]Id} {Error}", _id, ex.Message);
            AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error);
        }
    }

    private async Task Save()
    {
        try
        {
            validated = true;
            var interop = new Oqtane.UI.Interop(JSRuntime);
            if (await interop.FormValid(form))
            {
                if (PageState.Action == "Add")
                {
                    [Module] [Module] = new [Module]();
                    [Module].ModuleId = ModuleState.ModuleId;
                    [Module].Name = _name;
                    [Module] = await [Module]Service.Add[Module]Async([Module]);
                    await logger.LogInformation("[Module] Added {[Module]}", [Module]);
                }
                else
                {
                    [Module] [Module] = await [Module]Service.Get[Module]Async(_id, ModuleState.ModuleId);
                    [Module].Name = _name;
                    await [Module]Service.Update[Module]Async([Module]);
                    await logger.LogInformation("[Module] Updated {[Module]}", [Module]);
                }
                NavigationManager.NavigateTo(NavigateUrl());
            }
            else
            {
                AddModuleMessage(Localizer["Message.SaveValidation"], MessageType.Warning);
            }
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Saving [Module] {Error}", ex.Message);
            AddModuleMessage(Localizer["Message.SaveError"], MessageType.Error);
        }
    }
}
