📄 MatDenDagen/Components/Pages/Admin/Date.razor
@page "/admin/date"
@attribute [Authorize(Roles = "Admin")]
@using MatDenDagen.Infrastructure.Storage.Database
@using MatDenDagen.Models
@using MatDenDagen.Services
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components
@inject DateService dateService
@inject QuestionnaireContext questionnaireContext
@layout AdminLayout

<h2>Konfigurera datum</h2>

<EditForm FormName="ConfigureDateSpan" Model="@dateSpanModel" OnSubmit="@SaveDateSpan" Enhance>
  <p>
    <label>
      <span>Startdatum:</span>
      <input type="date" name="dateSpanModel.Start" value="@(dateSpanModel?.Start ?? string.Empty)" required />
    </label>
  </p>
  <p>
    <label>
      <span>Slutdatum:</span>
      <input type="date" name="dateSpanModel.End" value="@(dateSpanModel?.End ?? string.Empty)" required />
    </label>
  </p>
  <p>
    <input type="submit" value="Spara datumspan" />
  </p>
</EditForm>

@if (errorMessage != null)
{
  <p>@errorMessage</p>
}

@if (showSuccessMessage)
{
  <p>Datumspanen har sparats!</p>
}

<hr />

@if (currentDateSpan is null)
{
  <p>Ingen datumspan är konfigurerad ännu.</p>
}
else
{
  <EditForm FormName="RandomizeDate" Model="@dateModel" OnSubmit="@RandomizeDate" Enhance>
    <button type="submit" disabled="@(!canRandomizeDate)">
      Slumpa datum för <strong>dagen</strong>
    </button>
  </EditForm>

  @if (showRandomizeSuccessMessage)
  {
    <p>Datumet för <strong>dagen</strong> har slumpats och sparats!</p>
  }
}

@code {
  [SupplyParameterFromForm]
  private DateSpanModel? dateSpanModel { get; set; }

  [SupplyParameterFromForm]
  private object? dateModel { get; set; }

  private DateSpan? currentDateSpan { get; set; }
  private bool showSuccessMessage { get; set; }
  private bool showRandomizeSuccessMessage { get; set; }
  private string? errorMessage { get; set; }

  protected override async Task OnInitializedAsync()
  {
    currentDateSpan = await dateService.GetDateSpanAsync();

    if (currentDateSpan != null)
    {
      dateSpanModel ??= new()
      {
        Start = currentDateSpan.Start.ToString(),
        End = currentDateSpan.End.ToString()
      };
    }
    else
    {
      dateSpanModel ??= new();
    }

    dateModel ??= new();
  }

  private async Task SaveDateSpan()
  {
    if (dateSpanModel?.Start == null || dateSpanModel?.End == null)
    {
      errorMessage = "Både startdatum och slutdatum måste anges.";
      return;
    }

    if (!DateOnly.TryParse(dateSpanModel.Start, out var startDate) ||
        !DateOnly.TryParse(dateSpanModel.End, out var endDate))
    {
      errorMessage = "Ogiltigt datumformat. Använd ÅÅÅÅ-MM-DD.";
      return;
    }

    var dateSpan = new DateSpan { Start = startDate, End = endDate };

    if (!dateSpan.IsValid)
    {
      errorMessage = "Startdatum måste vara före eller lika med slutdatum.";
      return;
    }

    try
    {
      await dateService.SaveDateSpanAsync(dateSpan);
      currentDateSpan = dateSpan;
      showSuccessMessage = true;
    }
    catch (Exception ex)
    {
      errorMessage = "Ett fel uppstod vid sparande: " + ex.Message;
    }
  }

  private async Task RandomizeDate()
  {
    var result = await dateService.RandomizeDateAsync();
    if (result != null)
    {
      showRandomizeSuccessMessage = true;
    }
    else
    {
      errorMessage = "Kunde inte slumpa datum. Kontrollera att datumspanen är korrekt konfigurerad.";
    }
  }

  private bool canRandomizeDate => currentDateSpan?.IsValid ?? false;

  private sealed class DateSpanModel
  {
    public string? Start { get; set; }
    public string? End { get; set; }
  }
}