WebVenta/WebVentaCoche/Controllers/CartController.cs
2025-04-30 14:54:44 +02:00

148 lines
4.5 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WebVentaCoche.DataBase;
using WebVentaCoche.Helpers;
using WebVentaCoche.Models;
using System.Linq;
using System.Security.Claims;
using WebVentaCoche.Enums;
namespace WebVentaCoche.Controllers
{
public class CartController : Controller
{
private readonly ApplicationDbContext _context;
public CartController(ApplicationDbContext context)
{
_context = context;
}
//GET:/Cart/Index
public IActionResult Index()
{
// Diccionario de IDs -> Cantidades desde sesión (o cualquier fuente)
var itemsDict = CartSessionHelper.GetCartItems(HttpContext.Session);
// Crear tu ViewModel
var viewModel = new CartViewModel();
foreach (var kvp in itemsDict)
{
var productId = kvp.Key;
var amount = kvp.Value;
var product = _context.Products.Find(productId);
if (product != null)
{
viewModel.Products.Add(new CartProduct
{
Product = product,
Amount = amount
});
}
}
return View(viewModel);
}
// POST: /Cart/Purchase
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Purchase()
{
// 1) Obtén el carrito de la sesión
var items = CartSessionHelper.GetCartItems(HttpContext.Session);
if (!items.Any())
{
TempData["Error"] = "El carrito está vacío.";
return RedirectToAction("Index");
}
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier)!;
var addr = await _context.Addresses.Where(a => a.UserId == userId).FirstOrDefaultAsync();
if (addr == null)
{
TempData["Error"] = "No tienes ninguna dirección guardada. Primero añade una dirección en tu perfil.";
return RedirectToAction("Addresses", "Account");
}
var shippingAddress = $"{addr.Street}, {addr.City}, {addr.State}, {addr.ZipCode}, {addr.Country}";
var order = new Order
{
UserId = userId,
OrderDate = DateTime.UtcNow,
Status = OrderStatus.Pending,
ShippingAddress = shippingAddress
};
decimal total = 0m;
foreach (var (productId, quantity) in items)
{
var product = await _context.Products.FindAsync(productId);
if (product == null) continue;
var detail = new OrderDetail
{
ProductId = product.Id,
Quantity = quantity,
UnitPrice = product.Price
};
total += detail.Subtotal;
order.OrderDetails.Add(detail);
}
order.TotalAmount = total;
_context.Orders.Add(order);
await _context.SaveChangesAsync();
CartSessionHelper.ClearCart(HttpContext.Session);
return RedirectToAction("Details", "Order", new { id = order.Id });
}
//POST:/Cart/AddProductToCart
[HttpPost]
public IActionResult AddProductToCart(int id)
{
var product = _context.Products.Find(id);
if (product == null)
{
return NotFound();
}
// Añade a la sesión
CartSessionHelper.AddToCart(HttpContext.Session, id);
// Devuelve la cuenta actualizada para actualizar el badge
var productIds = CartSessionHelper.GetCartItems(HttpContext.Session);
int count = productIds.Count;
return Json(new { success = true, cartCount = count });
}
//POST:/Cart/Remove
[HttpPost]
public IActionResult Remove(int id)
{
CartSessionHelper.RemoveFromCart(HttpContext.Session, id);
return RedirectToAction("Index");
}
//POST:/Cart/Clear
[HttpPost]
public IActionResult Clear()
{
CartSessionHelper.ClearCart(HttpContext.Session);
return RedirectToAction("Index");
}
//GET:/Cart/Checkout
public IActionResult Checkout()
{
return View();
}
}
}