using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Security; using Nop.Web.Framework; using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc.Filters; using System; using System.IO; using System.Threading.Tasks; namespace Nop.Plugin.Misc.FruitBank.Controllers { [AuthorizeAdmin] [Area(AreaNames.ADMIN)] [AutoValidateAntiforgeryToken] public class FruitBankAudioController : BasePluginController { private readonly IPermissionService _permissionService; private readonly OpenAIApiService _aiApiService; private readonly FruitBankDbContext _dbContext; public FruitBankAudioController( IPermissionService permissionService, OpenAIApiService aiApiService, FruitBankDbContext fruitBankDbContext) { _permissionService = permissionService; _aiApiService = aiApiService; _dbContext = fruitBankDbContext; } /// /// Display the voice recorder page /// public async Task VoiceRecorder() { if (!await _permissionService.AuthorizeAsync(StandardPermission.Security.ACCESS_ADMIN_PANEL)) return AccessDeniedView(); return View("~/Plugins/Misc.FruitBankPlugin/Areas/Admin/Views/Extras/VoiceRecorder.cshtml"); } /// /// Endpoint to receive voice recording /// [HttpPost] public async Task ReceiveVoiceRecording(IFormFile audioFile) { if (!await _permissionService.AuthorizeAsync(StandardPermission.Security.ACCESS_ADMIN_PANEL)) return Json(new { success = false, message = "Access denied" }); if (audioFile == null || audioFile.Length == 0) { return Json(new { success = false, message = "No audio file received" }); } string productDataSummary = string.Empty; string orderDataSummary = string.Empty; var products = await _dbContext.Products.GetAll().ToListAsync(); foreach (var product in products) { //let's prepare basic product and stock information for AI analysis if (product == null) continue; var productName = product.Name; var stockQuantity = product.StockQuantity; productDataSummary += $"Product: {productName}, Stock Quantity: {stockQuantity}\n"; } var orders = await _dbContext.OrderDtos.GetAll(true).ToListAsync(); foreach (var order in orders) { //let's prepare basic order information for AI analysis if (order == null) continue; var orderId = order.Id; var customerName = order.Customer.Company; var totalAmount = order.OrderTotal; var dateofReceipt = order.DateOfReceipt; var isMeasurable = order.IsMeasurable; var itemsInOrder = order.OrderItemDtos.Count; orderDataSummary += $"Order ID: {orderId}, Customer: {customerName}, Total Amount: {totalAmount}, Date of Receipt: {dateofReceipt}, Is Measurable: {isMeasurable}, Items in Order: {itemsInOrder}\n"; } Console.WriteLine("Product Data Summary: " + productDataSummary); try { // Generate a unique filename var fileName = $"voice_recording_{DateTime.Now:yyyyMMdd_HHmmss}.webm"; // Define the path where you want to save the file var uploadsFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "uploads", "voice"); // Create directory if it doesn't exist if (!Directory.Exists(uploadsFolder)) { Directory.CreateDirectory(uploadsFolder); } var filePath = Path.Combine(uploadsFolder, fileName); // Save the file locally using (var stream = new FileStream(filePath, FileMode.Create)) { await audioFile.CopyToAsync(stream); } // Transcribe the audio using OpenAI Whisper API string transcribedText; using (var audioStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { transcribedText = await _aiApiService.TranscribeAudioAsync(audioStream, fileName, "hu"); // Hungarian language } if (string.IsNullOrEmpty(transcribedText)) { return Json(new { success = false, message = "Failed to transcribe audio" }); } string SystemMessage = "You are an assistant that helps with analyzing data for Fruitbank, a fruit trading company based in Hungary. " + "Provide insights and suggestions based on the provided data." + $"Products information: {productDataSummary}" + $"Orders information: {orderDataSummary}"; var AIResponse = await _aiApiService.GetSimpleResponseAsync(SystemMessage, $"Transcribed Text: {transcribedText}"); return Json(new { success = true, message = $"Audio transcribed successfully", transcription = AIResponse, filePath = filePath, fileSize = audioFile.Length }); } catch (Exception ex) { return Json(new { success = false, message = $"Error processing audio: {ex.Message}" }); } } } }