using Bit.Api.Models.Response;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Bit.Api.Controllers
{
    [Route("accounts/billing")]
    [Authorize("Application")]
    public class AccountsBillingController : Controller
    {
        private readonly IPaymentService _paymentService;
        private readonly IUserService _userService;

        public AccountsBillingController(
            IPaymentService paymentService,
            IUserService userService)
        {
            _paymentService = paymentService;
            _userService = userService;
        }

        [HttpGet("history")]
        [SelfHosted(NotSelfHostedOnly = true)]
        public async Task<BillingHistoryResponseModel> GetBillingHistory()
        {
            var user = await _userService.GetUserByPrincipalAsync(User);
            if (user == null)
            {
                throw new UnauthorizedAccessException();
            }

            var billingInfo = await _paymentService.GetBillingHistoryAsync(user);
            return new BillingHistoryResponseModel(billingInfo);
        }

        [HttpGet("payment-method")]
        [SelfHosted(NotSelfHostedOnly = true)]
        public async Task<BillingPaymentResponseModel> GetPaymentMethod()
        {
            var user = await _userService.GetUserByPrincipalAsync(User);
            if (user == null)
            {
                throw new UnauthorizedAccessException();
            }

            var billingInfo = await _paymentService.GetBillingBalanceAndSourceAsync(user);
            return new BillingPaymentResponseModel(billingInfo);
        }
    }
}