using Microsoft.AspNetCore.Mvc; using StockMaster.Data; using StockMaster.Models; using StockMaster.Services; using System.Linq; using System.Threading.Tasks; namespace StockMaster.Controllers { public class ProductController : BaseController { private readonly IProductService _productService; private readonly StockDbContext _context; public ProductController(IProductService productService, StockDbContext context) { _productService = productService; _context = context; } public async Task Index() { var products = await _productService.GetAllProductsAsync(); return View(products); } [HttpGet] public IActionResult Create() { ViewBag.Categories = _context.Categories.OrderBy(c => c.Name).ToList(); ViewBag.Suppliers = _context.Suppliers.OrderBy(s => s.Name).ToList(); return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task Create(Product product) { ModelState.Remove("Category"); ModelState.Remove("Supplier"); if (ModelState.IsValid) { try { var result = await _productService.CreateProductAsync(product); if (result) { TempData["Success"] = "Product created successfully"; return RedirectToAction("Index"); } ModelState.AddModelError("", "Failed to create product. SKU may already exist."); } catch (Exception ex) { ModelState.AddModelError("", $"Failed to create product: {ex.Message}"); } } ViewBag.Categories = _context.Categories.OrderBy(c => c.Name).ToList(); ViewBag.Suppliers = _context.Suppliers.OrderBy(s => s.Name).ToList(); return View(product); } [HttpGet] public async Task Edit(int id) { var product = await _productService.GetProductByIdAsync(id); if (product == null) return NotFound(); ViewBag.Categories = _context.Categories.OrderBy(c => c.Name).ToList(); ViewBag.Suppliers = _context.Suppliers.OrderBy(s => s.Name).ToList(); return View(product); } [HttpPost] [ValidateAntiForgeryToken] public async Task Edit(Product product) { ModelState.Remove("Category"); ModelState.Remove("Supplier"); if (ModelState.IsValid) { try { var currentUserName = User.Identity?.Name ?? "system"; var result = await _productService.UpdateProductWithUserAsync(product, currentUserName); if (result) { TempData["Success"] = "Product updated successfully"; return RedirectToAction("Index"); } ModelState.AddModelError("", "Failed to update product"); } catch (Exception ex) { ModelState.AddModelError("", $"Failed to update product: {ex.Message}"); } } ViewBag.Categories = _context.Categories.OrderBy(c => c.Name).ToList(); ViewBag.Suppliers = _context.Suppliers.OrderBy(s => s.Name).ToList(); return View(product); } [HttpPost] [ValidateAntiForgeryToken] public async Task Delete(int id) { try { var result = await _productService.DeleteProductAsync(id); if (result) { TempData["Success"] = "Product deleted successfully"; } else { TempData["Error"] = "Failed to delete product"; } } catch { TempData["Error"] = "Cannot delete product. It may be in use."; } return RedirectToAction("Index"); } } }