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); } }