📄 MatDenDagen/Components/Pages/Admin/Participants.razor
@page "/admin/participants"
@attribute [Authorize(Roles = "Admin")]
@using MatDenDagen.Infrastructure.Storage.Database
@using MatDenDagen.Models
@using Microsoft.AspNetCore.Authorization
@using Microsoft.EntityFrameworkCore
@inject TimeProvider timeProvider
@inject QuestionnaireContext questionnaireContext

<ul>
  @foreach (var participant in questionnaireContext.Participants)
  {
    var updateFormName = "UpdateParticipant-" + participant.Id;
    var removeFormName = "RemoveParticipant-" + participant.Id;
    <li>
      <EditForm FormName="@updateFormName" Model="@updateParticipantModel" OnSubmit="@UpdateParticipant"
                Enhance>
        <input type="hidden" name="updateParticipantModel.ParticipantId" value="@participant.Id.ToString()" />
        <p>
          <label>
            <span>Namn:</span>
            <input type="text" name="updateParticipantModel.Name" value="@participant.Name" required />
          </label>
        </p>
        <p>
          <label>
            <span>Telefonnummer:</span>
            <input type="text" name="updateParticipantModel.PhoneNumber" value="@participant.PhoneNumber" required />
          </label>
        </p>
        <p>
          <label>
            <span>Notifikationsoffset (minuter från midnatt):</span>
            <input type="number" name="updateParticipantModel.NotificationMinutesOffset" value="@participant.NotificationMinutesOffset" />
          </label>
        </p>
        <p>
          <input type="submit" value="Uppdatera" />
        </p>
      </EditForm>
      <EditForm FormName="@removeFormName" Model="@removeParticipantModel" OnSubmit="@RemoveParticipant"
                Enhance>
        <input type="hidden" name="removeParticipantModel.ParticipantId" value="@participant.Id.ToString()" />
        <input type="submit" value="Ta bort" />
      </EditForm>
    </li>
  }
</ul>

<hr />

<EditForm FormName="AddParticipant" Model="@addParticipantModel" OnSubmit="@AddParticipant" Enhance>
  <p>
    <label>
      <span>Namn:</span>
      <input type="text" name="addParticipantModel.Name" required />
    </label>
  </p>
   <p>
     <label>
       <span>Telefonnummer:</span>
       <input type="text" name="addParticipantModel.PhoneNumber" required />
     </label>
   </p>
   <p>
     <label>
       <span>Notifikationsoffset (minuter från midnatt):</span>
       <input type="number" name="addParticipantModel.NotificationMinutesOffset" />
     </label>
   </p>
   <p>
     <input type="submit" value="Lägg till" />
   </p>
</EditForm>

@code {
  [SupplyParameterFromForm]
  private AddParticipantModel? addParticipantModel { get; set; }

  [SupplyParameterFromForm]
  private RemoveParticipantModel? removeParticipantModel { get; set; }

  [SupplyParameterFromForm]
  private UpdateParticipantModel? updateParticipantModel { get; set; }

  protected override void OnInitialized()
  {
    addParticipantModel ??= new();
    removeParticipantModel ??= new();
    updateParticipantModel ??= new();
  }

  private async Task AddParticipant()
  {
    if (addParticipantModel?.Name is not string name || addParticipantModel?.PhoneNumber is not string phoneNumber)
    {
      return;
    }
    var participant = new Participant { 
      Id = Guid.CreateVersion7(timeProvider.GetUtcNow()), 
      Name = name, 
      PhoneNumber = phoneNumber,
      NotificationMinutesOffset = addParticipantModel?.NotificationMinutesOffset
    };
    questionnaireContext.Participants.Add(participant);
    await questionnaireContext.SaveChangesAsync();
  }

  private async Task UpdateParticipant()
  {
    if (updateParticipantModel?.ParticipantId is not string participantId || !Guid.TryParse(participantId, out var id))
    {
      return;
    }
    var participant = questionnaireContext.Participants.SingleOrDefault(p => p.Id == id);
    if (participant is null)
    {
      return;
    }
    if (updateParticipantModel.Name is string name)
    {
      participant.Name = name;
    }
    if (updateParticipantModel.PhoneNumber is string phoneNumber)
    {
      participant.PhoneNumber = phoneNumber;
    }
    participant.NotificationMinutesOffset = updateParticipantModel.NotificationMinutesOffset;
    await questionnaireContext.SaveChangesAsync();
  }

  private async Task RemoveParticipant()
  {
    if (removeParticipantModel?.ParticipantId is not string participantId || !Guid.TryParse(participantId, out var id))
    {
      return;
    }
    var participant = questionnaireContext.Participants.SingleOrDefault(p => p.Id == id);
    if (participant is null)
    {
      return;
    }
    questionnaireContext.Participants.Remove(participant);
    await questionnaireContext.SaveChangesAsync();
  }

  private sealed class AddParticipantModel
  {
    public string? Name { get; set; }
    public string? PhoneNumber { get; set; }
    public int? NotificationMinutesOffset { get; set; }
  }

  private sealed class RemoveParticipantModel
  {
    public string? ParticipantId { get; set; }
  }

  private sealed class UpdateParticipantModel
  {
    public string? ParticipantId { get; set; }
    public string? Name { get; set; }
    public string? PhoneNumber { get; set; }
    public int? NotificationMinutesOffset { get; set; }
  }
}