using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.Services.Report.SaleReports;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Reports.Sales
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class RevenueReportController : ControllerBase
    {
        private readonly ISaleReportService _saleReportService;

        public RevenueReportController(ISaleReportService saleReportService)
        {
            _saleReportService = saleReportService;
        }

        /// <summary>
        /// Thống kê doanh thu bán hàng
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả thống kê doanh thu</returns>
        [HttpPost("SaleRevenueStatistics")]
        [Authorize(Roles = "Report.SaleRevenueStatistics")]
        public async Task<IActionResult> SaleRevenueStatistics([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            var result = await _saleReportService.GetSaleRevenueStatisticsAsync(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Thống kê đơn hàng và doanh thu theo ngày
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả thống kê đơn hàng và doanh thu theo ngày</returns>
        [HttpPost("OrderRevenueByDate")]
        [Authorize(Roles = "Report.OrderProductionWithRevenue")]
        public async Task<IActionResult> OrderRevenueByDate([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            var result = await _saleReportService.GetOrderRevenueStatisticsByDateAsync(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Thống kê doanh thu theo ngày công ty nhận tiền (Collection Date)
        /// Chỉ bao gồm thống kê tài chính, không có thống kê trạng thái triển khai
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả thống kê doanh thu theo ngày nhận tiền</returns>
        [HttpPost("OrderRevenueByCollectionDate")]
        [Authorize(Roles = "Report.OrderProductionWithRevenue")]
        public async Task<IActionResult> OrderRevenueByCollectionDate([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            var result = await _saleReportService.GetOrderRevenueByCollectionDateAsync(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Thống kê doanh thu theo Sale (chỉ thống kê tài chính)
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả thống kê doanh thu theo Sale</returns>
        [HttpPost("OrderRevenueBySale")]
        [Authorize(Roles = "RevenueReport.OrderRevenueBySale")]
        public async Task<IActionResult> OrderRevenueBySale([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            var result = await _saleReportService.GetOrderRevenueBySaleAsync(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Thống kê doanh thu theo khách hàng
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả thống kê doanh thu theo khách hàng</returns>
        [HttpPost("CustomerRevenue")]
        [Authorize(Roles = "Report.CustomerRevenueStatistics")]
        public async Task<IActionResult> CustomerRevenue([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            var result = await _saleReportService.GetCustomerRevenueStatisticsAsync(param, currentUser.UserId);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin quyền của user cho báo cáo doanh thu theo khách hàng
        /// </summary>
        /// <returns>Thông tin quyền (có thể chọn sale hay không)</returns>
        [HttpGet("CustomerRevenue/Permissions")]
        [Authorize(Roles = "Report.CustomerRevenueStatistics")]
        public async Task<IActionResult> GetCustomerRevenuePermissions()
        {
            var currentUser = User.GetCurrentUser();
            var permissions = await _saleReportService.GetCustomerRevenuePermissionsAsync(currentUser.UserId);
            return Ok(permissions);
        }
    }
}
