📄 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
@layout MainLayout

<div class="submission-page">
  <h1>Skicka in ditt svar</h1>
  
  <div class="cookbook-intro card">
    <p>Fyll i dina svar på frågorna nedan, skriv så mycket eller lite du vill på varje fråga, eller skippa frågor du
      inte har något svar till.</p>
    </div>

    @if (success)
    {
      <div class="success-message card">
        <h2>Tack för ditt svar!</h2>
        <p>Ditt svar har skickats in och vi ser fram emot att planera en underbar matupplevelse tillsammans.</p>
      </div>
    }

    @if (errorMessage is not null)
    {
      <div class="error-message card">
        <h3>Ett fel uppstod</h3>
        <p>@errorMessage</p>
      </div>
    }

    @if (questions.Count == 0)
    {
      <div class="card">
        <p>Inga frågor hittades. Var god kontakta administratören.</p>
      </div>
    }
    else
    {
      <form method="post" enctype="multipart/form-data" @formname="Submission" class="submission-form">
        <div class="form-group card">
          <label>
            <span class="form-label">Telefonnummer (obligatoriskt)</span>
            <input type="text" name="phoneNumber" required placeholder="072XXXXXXX" class="form-input" />
          </label>
        </div>

        <div class="form-questions">
          @foreach (var question in questions)
          {
            <div class="form-group card">
              <label>
                <span class="question-text">@question.Text</span>
                <textarea name="answer[@question.Id]" class="form-textarea" placeholder="Ditt svar här..."></textarea>
              </label>
            </div>
          }
        </div>

        <div class="form-group card">
          <span class="form-label">Bilagor</span>
          <label class="file-upload-button">
            <input type="file" name="files" multiple class="form-file-hidden" />
            <span class="btn file-upload-text">Välj filer att ladda upp</span>
          </label>
          <p class="form-hint">Du kan ladda upp bilder eller dokument som kan vara relevanta.</p>
        </div>

        <div class="form-actions">
          <button type="submit" class="btn submit-btn">Skicka in svar</button>
        </div>
      </form>
    }
  </div>

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

  private bool success = false;

  private List<Question> questions = [];

  private string? errorMessage = null;

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

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

    var form = HttpContext.Request.Form;

    var phoneNumber = form["phoneNumber"].ToString();
    
    var participant = await questionnaireContext.Participants
        .SingleOrDefaultAsync(p => p.PhoneNumber == phoneNumber, HttpContext.RequestAborted);

    if (participant is null)
    {
      errorMessage = "Okänt telefonnummer. Var god kontakta administratören för att registrera ditt telefonnummer.";
      return;
    }

    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,
      Participant = participant.Id
    });
    await questionnaireContext.SaveChangesAsync(HttpContext.RequestAborted);

    success = true;
  }
}