using MySqlConnector;
using UtopiaCanteenSystem.Models;
namespace UtopiaCanteenSystem.Services;
///
/// Fetches lunch menu from HRMS: lunch_menu_week (by location_site_id) → lunch_menu_item → menu_item.
/// Uses IConfigService.GetHrmsLookupConnectionString(). Only current week is considered.
///
//public class MenuLookupService : IMenuLookupService
//{
// private readonly IConfigService _configService;
// public MenuLookupService(IConfigService configService)
// {
// _configService = configService;
// }
// ///
// public async Task> GetMenuItemsForSiteAsync(int siteIdNumeric, CancellationToken cancellationToken = default)
// {
// // Backwards-compatible: use today's local date.
// return await GetMenuItemsForSiteAndDateAsync(siteIdNumeric, DateTime.Today, cancellationToken).ConfigureAwait(false);
// }
// ///
// public async Task> GetMenuItemsForSiteAndDateAsync(int siteIdNumeric, DateTime menuDateLocal, CancellationToken cancellationToken = default)
// {
// var connectionString = _configService.GetHrmsLookupConnectionString();
// if (string.IsNullOrWhiteSpace(connectionString))
// return Array.Empty();
// //const string sql = @"
// // SELECT DISTINCT mi.id, mi.item_name, mi.item_type, mi.price
// // FROM lunch_menu_week w
// // JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
// // JOIN menu_item mi ON mi.id = li.menu_item_id
// // WHERE w.location_site_id = @siteId
// // AND CURDATE() BETWEEN w.week_start_date AND w.week_end_date
// // ORDER BY mi.item_type, mi.item_name";
// const string sql = @"
// SELECT
// mi.id,
// mi.item_name,
// mi.item_type,
// mi.price,
// li.menu_date,
// li.day_of_week
// FROM lunch_menu_week w
// JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
// JOIN menu_item mi ON mi.id = li.menu_item_id
// WHERE w.location_site_id = @siteId
// AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
// AND li.menu_date = @menuDate
// ORDER BY mi.item_name;";
// //const string sql = @"
// // SELECT
// // mi.id,
// // mi.item_name,
// // mi.item_type,
// // mi.price,
// // li.meal_name,
// // li.menu_date,
// // li.day_of_week
// // FROM lunch_menu_week w
// // JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
// // JOIN menu_item mi ON mi.id = li.menu_item_id
// // WHERE w.location_site_id = @siteId
// // AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
// // AND li.menu_date = @menuDate
// // ORDER BY li.meal_name, mi.item_name;";
// await using var conn = new MySqlConnection(connectionString);
// await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
// await using var cmd = new MySqlCommand(sql, conn);
// cmd.Parameters.AddWithValue("@siteId", siteIdNumeric);
// cmd.Parameters.AddWithValue("@menuDate", menuDateLocal.Date);
// var list = new List();
// await using var reader = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
// while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
// {
// //list.Add(new HrmsMenuItem
// //{
// // MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
// // ItemName = GetString(reader, 1),
// // ItemType = GetString(reader, 2),
// // Price = GetDecimal(reader, 3)
// //});
// list.Add(new HrmsMenuItem
// {
// MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
// ItemName = GetString(reader, 1),
// ItemType = GetString(reader, 2),
// Price = GetDecimal(reader, 3),
// MenuDate = GetString(reader, 4),
// DayOfWeek = GetString(reader, 5),
// MealName = string.Empty
// });
// //list.Add(new HrmsMenuItem
// //{
// // MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
// // ItemName = GetString(reader, 1),
// // ItemType = GetString(reader, 2),
// // Price = GetDecimal(reader, 3),
// // MealName = GetString(reader, 4),
// // MenuDate = GetString(reader, 5),
// // DayOfWeek = GetString(reader, 6),
// //});
// }
// return list;
// }
// private static string GetString(MySqlDataReader reader, int ordinal)
// {
// if (reader.IsDBNull(ordinal)) return string.Empty;
// var v = reader.GetValue(ordinal);
// return v?.ToString() ?? string.Empty;
// }
// private static decimal GetDecimal(MySqlDataReader reader, int ordinal)
// {
// if (reader.IsDBNull(ordinal)) return 0m;
// var v = reader.GetValue(ordinal);
// return v is decimal d ? d : Convert.ToDecimal(v);
// }
//}
public class MenuLookupService : IMenuLookupService
{
private readonly IConfigService _configService;
public MenuLookupService(IConfigService configService)
{
_configService = configService;
}
// Implementing the method for fetching menu items by site
public async Task> GetMenuItemsForSiteAsync(int siteIdNumeric, CancellationToken cancellationToken = default)
{
// Backwards-compatible: use today's local date.
return await GetMenuItemsForSiteAndDateAsync(siteIdNumeric, DateTime.Today, "NonManagement", cancellationToken).ConfigureAwait(false);
}
// Implementing the method for fetching menu items by site, date, and gradeType
public async Task> GetMenuItemsForSiteAndDateAsync(int siteIdNumeric, DateTime menuDateLocal, string gradeType, CancellationToken cancellationToken = default)
{
var connectionString = _configService.GetHrmsLookupConnectionString();
if (string.IsNullOrWhiteSpace(connectionString))
return Array.Empty();
const string sql = @"
SELECT
mi.id,
mi.item_name,
mi.item_type,
mi.price,
li.menu_date,
li.day_of_week
FROM lunch_menu_week w
JOIN lunch_menu_item li ON li.lunch_menu_week_id = w.id
JOIN menu_item mi ON mi.id = li.menu_item_id
WHERE w.location_site_id = @siteId
AND @menuDate BETWEEN w.week_start_date AND w.week_end_date
AND li.menu_date = @menuDate
AND mi.item_for = @itemFor
ORDER BY mi.item_name;";
var itemFor = GetItemForFromGradeType(gradeType);
await using var conn = new MySqlConnection(connectionString);
await conn.OpenAsync(cancellationToken).ConfigureAwait(false);
await using var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@siteId", siteIdNumeric);
cmd.Parameters.AddWithValue("@menuDate", menuDateLocal.Date);
cmd.Parameters.AddWithValue("@itemFor", itemFor);
var list = new List();
await using var reader = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
{
list.Add(new HrmsMenuItem
{
MenuItemId = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
ItemName = GetString(reader, 1),
ItemType = GetString(reader, 2),
Price = GetDecimal(reader, 3),
MenuDate = GetString(reader, 4),
DayOfWeek = GetString(reader, 5),
MealName = string.Empty
});
}
return list;
}
private static string GetItemForFromGradeType(string? gradeType)
{
var value = (gradeType ?? string.Empty).Trim().ToLowerInvariant();
return value switch
{
"management" => "MANAGEMENT",
"nonmanagement" => "NON_MANAGEMENT",
"non_management" => "NON_MANAGEMENT",
_ => string.Empty
};
}
private static string GetString(MySqlDataReader reader, int ordinal)
{
if (reader.IsDBNull(ordinal)) return string.Empty;
var v = reader.GetValue(ordinal);
return v?.ToString() ?? string.Empty;
}
private static decimal GetDecimal(MySqlDataReader reader, int ordinal)
{
if (reader.IsDBNull(ordinal)) return 0m;
var v = reader.GetValue(ordinal);
return v is decimal d ? d : Convert.ToDecimal(v);
}
}