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

namespace Ladaer.BackEnd.Controllers.Reports.FuelCards
{
    /// <summary>
    /// Controller để xử lý các báo cáo đổ dầu
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class FuelRefillReportController : ControllerBase
    {
        private readonly IFuelRefillReportService _fuelRefillReportService;
        private readonly IFuelRefillReportExcelService _fuelRefillReportExcelService;

        /// <summary>
        /// Khởi tạo một thể hiện của <see cref="FuelRefillReportController"/>.
        /// </summary>
        /// <param name="fuelRefillReportService">Dịch vụ báo cáo đổ dầu.</param>
        /// <param name="fuelRefillReportExcelService">Dịch vụ xuất Excel báo cáo đổ dầu.</param>
        public FuelRefillReportController(
            IFuelRefillReportService fuelRefillReportService,
            IFuelRefillReportExcelService fuelRefillReportExcelService)
        {
            _fuelRefillReportService = fuelRefillReportService;
            _fuelRefillReportExcelService = fuelRefillReportExcelService;
        }

        /// <summary>
        /// Lấy báo cáo đổ dầu theo lái xe
        /// </summary>
        /// <param name="param">Tham số bảng thông minh</param>
        /// <returns>Danh sách báo cáo đổ dầu theo lái xe</returns>
        /// <remarks>
        /// Filters có thể truyền trong PredicateObject:
        /// - StartDate, EndDate: Khoảng thời gian đổ dầu
        /// - DriverIds: Mảng ID lái xe
        /// - TruckIds: Mảng ID xe
        /// </remarks>
        [HttpPost("GetByDriver")]
        [Authorize(Roles = "FuelRefillReport.GetByDriver")]
        public async Task<IActionResult> GetByDriver([FromBody] SmartTableParam param)
        {
            try
            {
                var results = await _fuelRefillReportService.GetFuelRefillReportByDriverAsync(param);
                return Ok(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new { message = ex.Message });
            }
        }

        /// <summary>
        /// Xuất Excel báo cáo đổ dầu theo lái xe
        /// </summary>
        /// <param name="param">Tham số bảng thông minh (cùng điều kiện lọc với GetByDriver)</param>
        /// <returns>Kết quả xuất file Excel</returns>
        /// <remarks>
        /// Filters có thể truyền trong PredicateObject:
        /// - StartDate, EndDate: Khoảng thời gian đổ dầu
        /// - DriverIds: Mảng ID lái xe
        /// - TruckIds: Mảng ID xe
        /// 
        /// Điều kiện lọc giống với API GetByDriver
        /// </remarks>
        [HttpPost("ExportByDriver")]
        [Authorize(Roles = "FuelRefillReport.ExportByDriver")]
        public async Task<ActionResult<FuelRefillReportExcelResult>> ExportByDriver([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _fuelRefillReportExcelService.ExportByDriverAsync(param);

                if (result.Result == Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, new FuelRefillReportExcelResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi hệ thống: {ex.Message}"
                });
            }
        }
    }
}
