namespace PlanTempus.Application.Features.Services.Components;
///
/// Shared catalog for service detail data.
/// Used by all ServiceDetail* ViewComponents.
///
public static class ServiceDetailCatalog
{
private static readonly Dictionary Services = new()
{
["service-1"] = new ServiceDetailRecord
{
Key = "service-1",
Name = "Klip & Farve",
Category = "Kombi-behandlinger",
CalendarColor = "deep-orange",
IsActive = true,
DurationRange = "60-120",
FromPrice = "795 kr",
EmployeeCount = "4",
BookingsThisYear = "156",
Tags = new() { new("Populær", "popular"), new("Kombi", "combo"), new("Farve", "color") },
InternalNotes = "Komplet farvebehandling med klip. Husk konsultation ved første besøg. Anbefal Olaplex til kemisk behandlet hår.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Forkæl dig selv med en komplet forvandling! Vores Klip & Farve behandling inkluderer professionel farverådgivning, farvning tilpasset din hudtone, præcisionsklip og styling. Perfekt til dig der ønsker et helt nyt look."
},
["service-2"] = new ServiceDetailRecord
{
Key = "service-2",
Name = "Herreklip",
Category = "Klip",
CalendarColor = "blue",
IsActive = true,
DurationRange = "30",
FromPrice = "295 kr",
EmployeeCount = "6",
BookingsThisYear = "312",
Tags = new() { new("Populær", "popular") },
InternalNotes = "Standard herreklip. Inkluderer vask og styling.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = true,
Description = "Klassisk herreklip med vask, klip og styling. Vores erfarne stylister sikrer dig et skarpt og velplejet look."
},
["service-3"] = new ServiceDetailRecord
{
Key = "service-3",
Name = "Dameklip",
Category = "Klip",
CalendarColor = "teal",
IsActive = true,
DurationRange = "45-60",
FromPrice = "395 kr",
EmployeeCount = "5",
BookingsThisYear = "248",
Tags = new() { new("Populær", "popular") },
InternalNotes = "Standard dameklip. Altid konsultation først.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = true,
Description = "Professionel dameklip tilpasset din ansigtsform og ønsker. Inkluderer vask, klip og føn."
},
["service-4"] = new ServiceDetailRecord
{
Key = "service-4",
Name = "Balayage",
Category = "Farve",
CalendarColor = "purple",
IsActive = true,
DurationRange = "120-180",
FromPrice = "1.295 kr",
EmployeeCount = "3",
BookingsThisYear = "89",
Tags = new() { new("Farve", "color"), new("Premium", "popular") },
InternalNotes = "Avanceret farveteknik. Kun certificerede stylister. Kræver tid til konsultation.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Smuk, naturlig farveeffekt med håndmalede highlights. Perfekt til dig der ønsker et solkysset look med lavt vedligehold."
},
["service-5"] = new ServiceDetailRecord
{
Key = "service-5",
Name = "Olaplex Behandling",
Category = "Behandlinger",
CalendarColor = "green",
IsActive = true,
DurationRange = "30",
FromPrice = "295 kr",
EmployeeCount = "6",
BookingsThisYear = "134",
Tags = new() { new("Tilvalg", "combo") },
InternalNotes = "Kan tilføjes til alle farvebehandlinger. Anbefales ved kemisk behandlet hår.",
CanBookAsMain = false,
CanBookAsAddon = true,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Intensiv hårbehandling der reparerer og styrker håret. Ideel som tilvalg til farvebehandlinger."
},
["service-6"] = new ServiceDetailRecord
{
Key = "service-6",
Name = "Bryllupsfrisure",
Category = "Styling",
CalendarColor = "amber",
IsActive = false,
DurationRange = "90-120",
FromPrice = "895 kr",
EmployeeCount = "2",
BookingsThisYear = "24",
Tags = new() { new("Premium", "popular"), new("Sæson", "combo") },
InternalNotes = "Kun Maria og Anna kan bookes til dette. Kræver prøve-session 2 uger før.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = false,
IsFeatured = false,
Description = "Eksklusiv bryllupsfrisure med forudgående konsultation og prøvesession. Vi skaber din drømmefrisure til den store dag."
}
};
public static ServiceDetailRecord Get(string key)
{
if (!Services.TryGetValue(key, out var service))
throw new KeyNotFoundException($"Service with key '{key}' not found");
return service;
}
public static IEnumerable AllKeys => Services.Keys;
}
///
/// Complete service detail record used across all detail ViewComponents.
///
public record ServiceDetailRecord
{
// Identity
public required string Key { get; init; }
public required string Name { get; init; }
public required string Category { get; init; }
public required string CalendarColor { get; init; }
public required bool IsActive { get; init; }
// Stats (header)
public required string DurationRange { get; init; }
public required string FromPrice { get; init; }
public required string EmployeeCount { get; init; }
public required string BookingsThisYear { get; init; }
// Tags
public List Tags { get; init; } = new();
// Generelt tab - Grundlæggende
public required string InternalNotes { get; init; }
// Generelt tab - Bookingtype
public required bool CanBookAsMain { get; init; }
public required bool CanBookAsAddon { get; init; }
// Generelt tab - Online booking
public required bool ShowInOnlineBooking { get; init; }
public required bool IsFeatured { get; init; }
public required string Description { get; init; }
}
public record ServiceTag(string Text, string CssClass);