using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Lada.Framework.Data.Enums;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Categories;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Reports;
using Ladaer.BackEnd.Infrastructures.DTO.StoredProcedureResults;
using Ladaer.BackEnd.Infrastructures.Services.Report.Orders;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Reports.Orders
{
    /// <summary>
    /// Controller để xử lý các báo cáo tài chính đơn hàng
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class OrderFinReportController : ControllerBase
    {
        private readonly IOrderFinReportService _orderFinReportService;

        /// <summary>
        /// Khởi tạo một thể hiện của <see cref="OrderFinReportController"/>.
        /// </summary>
        /// <param name="orderFinReportService">Dịch vụ báo cáo tài chính đơn hàng.</param>
        public OrderFinReportController(IOrderFinReportService orderFinReportService)
        {
            _orderFinReportService = orderFinReportService;
        }




        /// <summary>
        /// Chuẩn bị dữ liệu bộ lọc: trạng thái và trạng thái vật lý
        /// </summary>
        /// <returns>Model chứa danh sách option trạng thái và trạng thái vật lý</returns>
        [HttpGet("PrepareBankTransferSummaryBySaleModel")]
        [Authorize(Roles = "OrderFinReport.GetBankTransferSummaryBySale")]
        public IActionResult PrepareBankTransferSummaryBySaleModel()
        {
            var model = new BankTransferSummaryBySalePrepareModel();

            // Build status options từ enum OrderStatus
            foreach (OrderStatus status in Enum.GetValues(typeof(OrderStatus)))
            {
                model.StatusOptions.Add(new AppItem
                {
                    Id = (int)status,
                    Name = status.GetDescription()
                });
            }

            // Build physical status options từ enum OrderPhysicalStatus
            foreach (OrderPhysicalStatus physicalStatus in Enum.GetValues(typeof(OrderPhysicalStatus)))
            {
                model.PhysicalStatusOptions.Add(new AppItem
                {
                    Id = (int)physicalStatus,
                    Name = physicalStatus.GetDescription()
                });
            }

            return Ok(model);
        }

        /// <summary>
        /// Lấy thống kê chuyển khoản ngân hàng theo sale
        /// </summary>
        /// <param name="param">Tham số bảng thông minh</param>
        /// <returns>Danh sách thống kê chuyển khoản theo sale</returns>
        [HttpPost("GetBankTransferSummaryBySale")]
        [Authorize(Roles = "OrderFinReport.GetBankTransferSummaryBySale")]
        public async Task<IActionResult> GetBankTransferSummaryBySale([FromBody] SmartTableParam param)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                var results = await _orderFinReportService.GetBankTransferSummaryBySaleAsync(
                    param, currentUser.UserId);

                return Ok(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new { message = ex.Message });
            }
        }
    }
}
