using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using QRRapidoApp.Models.ViewModels; using QRRapidoApp.Services; using System.Security.Claims; namespace QRRapidoApp.Controllers { [Authorize] public class PremiumController : Controller { private readonly StripeService _stripeService; private readonly IUserService _userService; private readonly AdDisplayService _adDisplayService; private readonly IConfiguration _config; private readonly ILogger _logger; public PremiumController(StripeService stripeService, IUserService userService, AdDisplayService adDisplayService, IConfiguration config, ILogger logger) { _stripeService = stripeService; _userService = userService; _adDisplayService = adDisplayService; _config = config; _logger = logger; } [HttpGet] public IActionResult Upgrade() { return RedirectToAction("SelecaoPlano", "Pagamento"); } [HttpGet] public async Task Dashboard() { var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userId)) { return RedirectToAction("Login", "Account"); } var user = await _userService.GetUserAsync(userId); if (user?.IsPremium != true) { return RedirectToAction("Upgrade"); } var model = new PremiumDashboardViewModel { User = user, QRCodesThisMonth = await _userService.GetQRCountThisMonthAsync(userId), TotalQRCodes = user.QRHistoryIds?.Count ?? 0, SubscriptionStatus = await _stripeService.GetSubscriptionStatusAsync(user.StripeSubscriptionId), RecentQRCodes = await _userService.GetUserQRHistoryAsync(userId, 10) }; // Calculate next billing date (simplified) if (user.PremiumExpiresAt.HasValue) { model.NextBillingDate = user.PremiumExpiresAt.Value.AddDays(-2); // Approximate } // QR type statistics model.QRTypeStats = model.RecentQRCodes .GroupBy(q => q.Type) .ToDictionary(g => g.Key, g => g.Count()); return View(model); } [HttpPost] public async Task CancelSubscription() { var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userId)) { return Json(new { success = false, error = "User not authenticated" }); } try { var user = await _userService.GetUserAsync(userId); if (user?.StripeSubscriptionId == null) { return Json(new { success = false, error = "No active subscription found" }); } var success = await _stripeService.CancelSubscriptionAsync(user.StripeSubscriptionId); if (success) { TempData["Success"] = "Assinatura cancelada com sucesso. Você manterá o acesso premium até o final do período pago."; return Json(new { success = true }); } else { return Json(new { success = false, error = "Failed to cancel subscription" }); } } catch (Exception ex) { _logger.LogError(ex, $"Error canceling subscription for user {userId}"); return Json(new { success = false, error = ex.Message }); } } [HttpGet] public async Task BillingPortal() { var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userId)) { return RedirectToAction("Login", "Account"); } try { // This would create a Stripe billing portal session // For now, redirect to dashboard return RedirectToAction("Dashboard"); } catch (Exception ex) { _logger.LogError(ex, $"Error creating billing portal for user {userId}"); return RedirectToAction("Dashboard"); } } } }