using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace UtopiaCanteenSystem.Services;
///
/// Admin authentication service via UIND portal API (plain-text response).
///
public class AuthService : IAuthService
{
private static readonly HttpClient HttpClient = new();
private readonly string _baseUrl;
public AuthService(string authenticationUrl)
{
_baseUrl = (authenticationUrl ?? string.Empty).Trim();
if (!string.IsNullOrEmpty(_baseUrl) && !_baseUrl.EndsWith("/"))
_baseUrl += "/";
}
public async Task LoginAsync(string username, string password, CancellationToken cancellationToken = default)
{
var user = username?.Trim() ?? string.Empty;
var pass = password ?? string.Empty;
if (string.IsNullOrWhiteSpace(_baseUrl))
return new AuthResult(false, string.Empty);
if (string.IsNullOrWhiteSpace(user) || string.IsNullOrEmpty(pass))
return new AuthResult(false, string.Empty);
// Build URL:
// {baseUrl}{username}/{password}
// Must URL-encode both values.
var url = $"{_baseUrl}{Uri.EscapeDataString(user)}/{Uri.EscapeDataString(pass)}";
try
{
using var resp = await HttpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
var body = (await resp.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)).Trim();
// Portal returns plain text:
// "NOT FOUND" => failure
// otherwise => success and body contains EmployeeId (or user identifier)
if (body.Equals("NOT FOUND", StringComparison.OrdinalIgnoreCase))
return new AuthResult(false, string.Empty);
return new AuthResult(true, body);
}
catch
{
return new AuthResult(false, string.Empty);
}
}
}