using Ladaer.BackEnd.Infrastructures.DTO.Models.Monitor;
using Ladaer.BackEnd.Infrastructures.Services.Monitor;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Monitor.OrderMonitor
{
    [Authorize]
    [ApiController]
    [Area("Monitor")]
    [Route("api/Monitor/[controller]")]
    public class OrderRiskController : ControllerBase
    {
        private readonly IOrderRiskService _orderRiskService;

        public OrderRiskController(IOrderRiskService orderRiskService)
        {
            _orderRiskService = orderRiskService;
        }

        #region Source Fee
        /// <summary>
        /// Lấy danh sách đơn hàng thu người gửi nhưng không có SourceCashierId
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        /// <param name="page">Trang (default: 1)</param>
        /// <param name="pageSize">Số bản ghi/trang (default: 50)</param>
        [HttpGet("NoSourceCashier")]
        public async Task<IActionResult> GetOrdersWithoutSourceCashier(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null,
            [FromQuery] int page = 1,
            [FromQuery] int pageSize = 50)
        {
            try
            {
                var param = new OrderRiskSearchParam
                {
                    FromDate = fromDate,
                    ToDate = toDate,
                    PageNumber = page,
                    PageSize = pageSize
                };

                var result = await _orderRiskService.GetOrdersWithoutSourceCashierAsync(param);

                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        /// <summary>
        /// Lấy tổng quan các rủi ro đơn hàng (số đơn, tổng tiền)
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        [HttpGet("Overview")]
        public async Task<IActionResult> GetOrderRiskOverview(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null)
        {
            try
            {
                var result = await _orderRiskService.GetOrderRiskOverviewAsync(fromDate, toDate);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
        #endregion

        #region Dest Fee
        /// <summary>
        /// Lấy danh sách đơn hàng thu người nhận nhưng không có DestCashierId
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        /// <param name="page">Trang (default: 1)</param>
        /// <param name="pageSize">Số bản ghi/trang (default: 50)</param>
        [HttpGet("NoDestCashier")]
        public async Task<IActionResult> GetOrdersWithoutDestCashier(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null,
            [FromQuery] int page = 1,
            [FromQuery] int pageSize = 50)
        {
            try
            {
                var param = new OrderRiskSearchParam
                {
                    FromDate = fromDate,
                    ToDate = toDate,
                    PageNumber = page,
                    PageSize = pageSize
                };

                var result = await _orderRiskService.GetOrdersWithoutDestCashierAsync(param);

                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        /// <summary>
        /// Lấy tổng quan các đơn hàng thu người nhận thiếu DestCashier (số đơn, tổng tiền)
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        [HttpGet("NoDestCashier/Overview")]
        public async Task<IActionResult> GetOrderRiskOverviewForDestCashier(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null)
        {
            try
            {
                var result = await _orderRiskService.GetOrderRiskOverviewForDestCashierAsync(fromDate, toDate);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
        #endregion

        #region SplitFee
        /// <summary>
        /// Lấy danh sách đơn hàng thu cả 2 đầu nhưng thiếu SourceCashierId hoặc DestCashierId
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        /// <param name="page">Trang (default: 1)</param>
        /// <param name="pageSize">Số bản ghi/trang (default: 50)</param>
        [HttpGet("BothPayMissingCashier")]
        public async Task<IActionResult> GetOrdersBothPayWithoutCashier(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null,
            [FromQuery] int page = 1,
            [FromQuery] int pageSize = 50)
        {
            try
            {
                var param = new OrderRiskSearchParam
                {
                    FromDate = fromDate,
                    ToDate = toDate,
                    PageNumber = page,
                    PageSize = pageSize
                };

                var result = await _orderRiskService.GetOrdersBothPayWithoutCashierAsync(param);

                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        /// <summary>
        /// Lấy tổng quan các đơn hàng thu cả 2 đầu thiếu Cashier (số đơn, tổng tiền)
        /// </summary>
        /// <param name="fromDate">Từ ngày (optional)</param>
        /// <param name="toDate">Đến ngày (optional)</param>
        [HttpGet("BothPayMissingCashier/Overview")]
        public async Task<IActionResult> GetOrderRiskOverviewForBothPay(
            [FromQuery] DateTime? fromDate = null,
            [FromQuery] DateTime? toDate = null)
        {
            try
            {
                var result = await _orderRiskService.GetOrderRiskOverviewForBothPayAsync(fromDate, toDate);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        } 
        #endregion
    }
}
