using eprintServer.Data;
using eprintServer.Entities;
using eprintServer.Requests;
using Microsoft.EntityFrameworkCore;
namespace eprintServer.Services;
public class ContactService
{
private readonly DataContext _context;
// Cache to hold the single instance ID in memory after the first load
private static int? _uniqueContactId = null;
public ContactService(DataContext context)
{
_context = context;
}
///
/// Ensures a single instance of ContactSettings exists and retrieves it,
/// creating a default one if none is found.
///
public async Task GetOrInitializeContactSettingsAsync()
{
ContactSettings? settings;
// 1. Try to load by cached ID
if (_uniqueContactId.HasValue)
{
settings = await _context.ContactSettings.FirstOrDefaultAsync(c => c.Id == _uniqueContactId.Value);
if (settings != null)
{
return settings;
}
}
// 2. If not found, perform a full search
settings = await _context.ContactSettings.FirstOrDefaultAsync();
if (settings == null)
{
// 3. Create a new instance with empty defaults and save it
settings = new ContactSettings
{
Email = string.Empty,
Phone = string.Empty,
Address = string.Empty,
MapUrl = string.Empty,
WorkingHours = string.Empty,
EmailRecipients = new List()
};
_context.ContactSettings.Add(settings);
await _context.SaveChangesAsync();
}
// 4. Cache the ID
_uniqueContactId = settings.Id;
return settings;
}
///
/// Updates the existing unique ContactSettings instance,
/// only applying updates for non-null properties in the request.
///
public async Task UpdateContactInfoAsync(UpdateContactInfoRequest request)
{
var settings = await GetOrInitializeContactSettingsAsync();
bool changed = false;
// Apply conditional updates: update only if the request property is not null
if (request.Email != null)
{
settings.Email = request.Email;
changed = true;
}
if (request.Phone != null)
{
settings.Phone = request.Phone;
changed = true;
}
if (request.Address != null)
{
settings.Address = request.Address;
changed = true;
}
if (request.MapUrl != null)
{
settings.MapUrl = request.MapUrl;
changed = true;
}
if (request.WorkingHours != null)
{
settings.WorkingHours = request.WorkingHours;
changed = true;
}
if (changed)
{
settings.UpdatedAt = DateTime.UtcNow;
_context.ContactSettings.Update(settings);
await _context.SaveChangesAsync();
}
return settings;
}
///
/// Adds a unique email to the recipient list.
///
public async Task AddEmailRecipientAsync(string email)
{
var settings = await GetOrInitializeContactSettingsAsync();
// Check if email is already present (case-insensitive)
if (!settings.EmailRecipients.Any(e => e.Equals(email, StringComparison.OrdinalIgnoreCase)))
{
settings.EmailRecipients.Add(email);
settings.UpdatedAt = DateTime.UtcNow;
_context.ContactSettings.Update(settings);
await _context.SaveChangesAsync();
}
return settings;
}
///
/// Removes an email from the recipient list.
///
public async Task RemoveEmailRecipientAsync(string email)
{
var settings = await GetOrInitializeContactSettingsAsync();
// Remove the email (case-insensitive)
int initialCount = settings.EmailRecipients.Count;
settings.EmailRecipients.RemoveAll(e => e.Equals(email, StringComparison.OrdinalIgnoreCase));
if (settings.EmailRecipients.Count != initialCount)
{
settings.UpdatedAt = DateTime.UtcNow;
_context.ContactSettings.Update(settings);
await _context.SaveChangesAsync();
}
return settings;
}
}