using Lada.Framework.DTO;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Identity;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller cho việc xuất Excel thông tin đơn hàng
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class ExportOrderController : ControllerBase
    {
        private readonly IExportOrderService _exportOrderService;
        private readonly IUserService _userService;

        public ExportOrderController(
            IExportOrderService exportOrderService,
            IUserService userService)
        {
            _exportOrderService = exportOrderService;
            _userService = userService;
        }

        /// <summary>
        /// Xuất Excel thông tin đơn hàng theo danh sách OrderId hoặc OrderCode
        /// </summary>
        /// <param name="model">Thông tin đầu vào</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export")]
        public async Task<ActionResult<ExportOrderResult>> ExportOrders([FromBody] ExportOrderModel model)
        {
            try
            {
                // Lấy thông tin user hiện tại
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không thể xác định người dùng hiện tại");
                }

                // Validate input
                if (model == null)
                {
                    return BadRequest("Dữ liệu đầu vào không hợp lệ");
                }

                if ((model.OrderIds == null || !model.OrderIds.Any()) &&
                    (model.OrderCodes == null || !model.OrderCodes.Any()))
                {
                    return BadRequest("Vui lòng cung cấp danh sách OrderId hoặc OrderCode");
                }

                // Set thông tin người tạo
                model.UpdatedBy = currentUser.UserId;
                model.UpdatedByUserName = currentUser.UserName;

                // Gọi service xuất Excel
                var result = await _exportOrderService.ExportOrdersToExcelAsync(model);

                if (result.Result == Result.Success)
                {
                    // Tạo URL download nếu cần
                    if (!string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/exports/{fileName}";
                    }

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

        /// <summary>
        /// Xuất Excel thông tin đơn hàng theo danh sách OrderId
        /// </summary>
        /// <param name="orderIds">Danh sách ID đơn hàng</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export-by-ids")]
        public async Task<ActionResult<ExportOrderResult>> ExportOrdersByIds([FromBody] List<int> orderIds)
        {
            try
            {
                // Lấy thông tin user hiện tại
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không thể xác định người dùng hiện tại");
                }

                // Validate input
                if (orderIds == null || !orderIds.Any())
                {
                    return BadRequest("Danh sách OrderId không được để trống");
                }

                // Tạo model
                var model = new ExportOrderModel
                {
                    OrderIds = orderIds,
                    FileName = $"DanhSachDonHang_Ids_{DateTime.Now:yyyyMMdd_HHmmss}",
                    UpdatedBy = currentUser.UserId,
                    UpdatedByUserName = currentUser.UserName
                };

                // Gọi service xuất Excel
                var result = await _exportOrderService.ExportOrdersToExcelAsync(model);

                if (result.Result == Result.Success)
                {
                    // Tạo URL download nếu cần
                    if (!string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/exports/{fileName}";
                    }

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

        /// <summary>
        /// Xuất Excel thông tin đơn hàng theo danh sách OrderCode
        /// </summary>
        /// <param name="orderCodes">Danh sách mã đơn hàng</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export-by-codes")]
        public async Task<ActionResult<ExportOrderResult>> ExportOrdersByCodes([FromBody] List<string> orderCodes)
        {
            try
            {
                // Lấy thông tin user hiện tại
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không thể xác định người dùng hiện tại");
                }

                // Validate input
                if (orderCodes == null || !orderCodes.Any())
                {
                    return BadRequest("Danh sách OrderCode không được để trống");
                }

                // Tạo model
                var model = new ExportOrderModel
                {
                    OrderCodes = orderCodes,
                    FileName = $"DanhSachDonHang_Codes_{DateTime.Now:yyyyMMdd_HHmmss}",
                    UpdatedBy = currentUser.UserId,
                    UpdatedByUserName = currentUser.UserName
                };

                // Gọi service xuất Excel
                var result = await _exportOrderService.ExportOrdersToExcelAsync(model);

                if (result.Result == Result.Success)
                {
                    // Tạo URL download nếu cần
                    if (!string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/exports/{fileName}";
                    }

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

        /// <summary>
        /// Download file Excel đã xuất
        /// </summary>
        /// <param name="fileName">Tên file</param>
        /// <returns>File Excel</returns>
        [HttpGet("download/{fileName}")]
        public async Task<IActionResult> DownloadFile(string fileName)
        {
            try
            {
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", fileName);

                if (!System.IO.File.Exists(filePath))
                {
                    return NotFound("File không tồn tại");
                }

                var fileBytes = await System.IO.File.ReadAllBytesAsync(filePath);
                var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

                return File(fileBytes, contentType, fileName);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi khi download file: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh sách file Excel đã xuất
        /// </summary>
        /// <returns>Danh sách file</returns>
        [HttpGet("files")]
        public async Task<ActionResult<List<object>>> GetExportedFiles()
        {
            try
            {
                var exportFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports");

                if (!Directory.Exists(exportFolder))
                {
                    return Ok(new List<object>());
                }

                var files = Directory.GetFiles(exportFolder, "*.xlsx")
                    .Select(filePath => new
                    {
                        FileName = Path.GetFileName(filePath),
                        FileSize = new FileInfo(filePath).Length,
                        CreatedTime = System.IO.File.GetCreationTime(filePath),
                        DownloadUrl = $"/api/ExportOrder/download/{Path.GetFileName(filePath)}"
                    })
                    .OrderByDescending(f => f.CreatedTime)
                    .ToList();

                return Ok(files);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi khi lấy danh sách file: {ex.Message}");
            }
        }
    }
}
