📄 MatDenDagen/Components/Pages/Submission.razor
@page "/submission"
@using MatDenDagen.Infrastructure.Storage.BlobStorage
@using MatDenDagen.Infrastructure.Storage.Database
@using MatDenDagen.Models
@using Microsoft.AspNetCore.Http
@using Microsoft.EntityFrameworkCore
@inject TimeProvider timeProvider
@inject BlobStorageService blobService
@inject QuestionnaireContext questionnaireContext
@inject NavigationManager navigationManager

<h1>Skicka in svar</h1>

@if (success)
{
  <p>Ditt svar har skickats in.</p>
}

@if (questions.Count == 0)
{
  <p>Inga frågor hittades.</p>
}
else
{
  <form method="post" enctype="multipart/form-data" @formname="Submission">
    @foreach (var question in questions)
    {
      <p>
        <label>
          <span>@question.Text</span><br/>
          <textarea name="answer[@question.Id]"></textarea>
        </label>
      </p>
    }
    <p>
      <label>
        <span>Bilagor</span><br/>
        <input type="file" name="files" multiple />
      </label>
    </p>
    <p>
      <button type="submit">Skicka</button>
    </p>
  </form>
}

@code {
  [CascadingParameter]
  private HttpContext? HttpContext { get; set; }

  private bool success = false;

  private List<Question> questions = [];

  protected override async Task OnInitializedAsync()
  {
    questions = await questionnaireContext.Questions.ToListAsync(HttpContext.RequestAborted);

    if (HttpContext?.Request.Method != "POST")
      return;

    var form = HttpContext.Request.Form;

    var uploads = new List<Upload>();
    foreach (var file in form.Files)
    {
      await using var stream = file.OpenReadStream();
      var result = await blobService.SaveBlob(stream, HttpContext.RequestAborted);
      uploads.Add(new Upload { Id = result.Id, Name = file.FileName });
    }

    questionnaireContext.Submissions.Add(new()
    {
      Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
      Answers = questions.Select(q => new Answer
      {
        Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
        QuestionId = q.Id,
        Text = form[$"answer[{q.Id}]"].ToString()
      }).ToList(),
      Uploads = uploads
    });
    await questionnaireContext.SaveChangesAsync(HttpContext.RequestAborted);

    success = true;
  }
}