@page "/students/edit"
@using Microsoft.EntityFrameworkCore
@inject AppDbContext Context
@inject NavigationManager NavigationManager

<PageTitle>Edit Student - TSA Chapter Organizer</PageTitle>

<MudText Typo="Typo.h3">Edit</MudText>
<MudText Typo="Typo.h4">Student@(@Student == null ? "" : $" ({Student.Name})")</MudText>



@if (Student is null)
{
    <p><em>Loading...</em></p>
}
else
{
    /* https://www.mudblazor.com/components/form */
    /* https://medium.com/@husainalbar/applying-mudblazor-for-crud-operations-in-our-blazor-project-a343037a52ef */
    <EditForm method="post" Model="Student" OnValidSubmit="UpdateStudent" FormName="edit" Enhance>
        <DataAnnotationsValidator/>
        <MudGrid>
            <MudItem xs="12" sm="7">
                <MudPaper Class="pa-4">
                    <MudTextField T="string" Label="First Name" @bind-Value="Student.FirstName" For="@(() => Student.FirstName)"></MudTextField>
                    <MudTextField T="string" Label="Last Name" @bind-Value="Student.LastName" For="@(() => Student.LastName)"></MudTextField>
                    <MudTextField T="string" Label="Email Adress" @bind-Value="Student.Email" For="@(() => Student.Email)"></MudTextField>
                    <MudTextField T="string" Label="Phone Number" @bind-Value="Student.PhoneNumber" For="@(() => Student.PhoneNumber)"></MudTextField>
                    <MudTextField T="int" Label="Grade" @bind-Value="Student.Grade" For="@(() => Student.Grade)"></MudTextField>
                    <MudTextField T="int" Label="TSA Year" @bind-Value="Student.TsaYear" For="@(() => Student.TsaYear)"></MudTextField>
                    <MudTextField T="string" Label="Regional Id" @bind-Value="Student.RegionalId" For="@(() => Student.RegionalId)"></MudTextField>
                    <MudTextField T="string" Label="State Id" @bind-Value="Student.StateId" For="@(() => Student.StateId)"></MudTextField>
                    <MudTextField T="string" Label="National Id" @bind-Value="Student.NationalId" For="@(() => Student.NationalId)"></MudTextField>
                    <MudSelect T="OfficerRole?" @bind-Value="@Student.OfficerRole" Label="Officer Role">

                        <MudSelectItem T="OfficerRole?" Value="@null">-not an officer-</MudSelectItem>
                        @foreach (var officerRole in Enum.GetValues(typeof(OfficerRole)).Cast<OfficerRole>())
                        {
                            <MudSelectItem T="OfficerRole?" Value="@(officerRole)"></MudSelectItem>
                        }
                    </MudSelect>
                </MudPaper>
            </MudItem>
        </MudGrid>
        <MudButton StartIcon="@Icons.Material.Filled.ArrowBack" Href="students">Back</MudButton>
        <MudButton StartIcon="@Icons.Material.Filled.Save"  OnClick="UpdateStudent">Save</MudButton>
    </EditForm>
}

@code {
    [SupplyParameterFromQuery]
    private int Id { get; set; }

    [SupplyParameterFromForm]
    private Student? Student { get; set; }

    protected override async Task OnInitializedAsync()
    {
        Student ??= await Context.Students.FirstOrDefaultAsync(m => m.Id == Id);

        if (Student is null)
        {
            NavigationManager.NavigateTo("notfound");
        }
    }

    // To protect from overposting attacks, enable the specific properties you want to bind to.
    // For more information, see https://learn.microsoft.com/aspnet/core/blazor/forms/#mitigate-overposting-attacks.
    private async Task UpdateStudent()
    { 
        if (Student.OfficerRole == 0)
            Student.OfficerRole = null;

        Context.Attach(Student!).State = EntityState.Modified;

        try
        {
            await Context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!StudentExists(Student!.Id))
            {
                NavigationManager.NavigateTo("notfound");
            }
            else
            {
                throw;
            }
        }

        NavigationManager.NavigateTo("/students");
    }

    private bool StudentExists(int id)
    {
        return Context.Students.Any(e => e.Id == id);
    }
}
