using CartWise.Application.Interfaces; using CartWise.Infrastructure.Identity; using CartWise.Web.ViewModels.Household; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace CartWise.Web.Controllers; [Authorize] public class HouseholdController : Controller { private readonly IHouseholdService _householdService; private readonly UserManager _userManager; public HouseholdController(IHouseholdService householdService, UserManager userManager) { _householdService = householdService; _userManager = userManager; } [HttpGet] [Route("household")] public async Task Index() { var userId = _userManager.GetUserId(User)!; var household = await _householdService.GetCurrentHouseholdAsync(userId); if (household is null) { return RedirectToAction(nameof(Create)); } var members = new List(); foreach (var member in household.Members.OrderBy(m => m.JoinedUtc)) { var memberUser = await _userManager.FindByIdAsync(member.UserId); var displayName = !string.IsNullOrWhiteSpace(memberUser?.DisplayName) ? memberUser.DisplayName : memberUser?.Email ?? "Unknown"; members.Add(new HouseholdMemberViewModel { UserId = member.UserId, DisplayName = displayName, Role = member.Role, JoinedUtc = member.JoinedUtc }); } var viewModel = new HouseholdIndexViewModel { HouseholdId = household.HouseholdId, Name = household.Name, CreatedUtc = household.CreatedUtc, Members = members }; return View(viewModel); } [HttpGet] [Route("household/create")] public async Task Create() { var userId = _userManager.GetUserId(User)!; var existingHousehold = await _householdService.GetCurrentHouseholdAsync(userId); if (existingHousehold is not null) { return RedirectToAction(nameof(Index)); } return View(new CreateHouseholdViewModel()); } [HttpPost] [Route("household/create")] [ValidateAntiForgeryToken] public async Task Create(CreateHouseholdViewModel model) { if (!ModelState.IsValid) { return View(model); } var userId = _userManager.GetUserId(User)!; var result = await _householdService.CreateHouseholdAsync(model.Name, userId); if (!result.IsSuccess) { ModelState.AddModelError(string.Empty, result.Error!); return View(model); } return RedirectToAction(nameof(Index)); } }