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

namespace Ladaer.BackEnd.Controllers.Orders
{
    /// <summary>
    /// Controller cho việc xuất Excel đơn hàng (Generic)
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class OrderExportController : ControllerBase
    {
        private readonly IOrderExportService _orderExportService;
        private readonly IUserService _userService;

        public OrderExportController(
            IOrderExportService orderExportService,
            IUserService userService)
        {
            _orderExportService = orderExportService;
            _userService = userService;
        }

        /// <summary>
        /// Xuất Excel đơn hàng với template được chỉ định
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export")]
        public async Task<ActionResult<OrderExportResult>> ExportOrders([FromBody] OrderExportModel 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ệ");
                }

                // Kiểm tra template có được hỗ trợ không
                if (!_orderExportService.IsTemplateSupported(model.TemplateType))
                {
                    return BadRequest($"Template {model.GetTemplateTypeName()} chưa được hỗ trợ");
                }

                // 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 _orderExportService.ExportOrdersAsync(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 OrderExportResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi hệ thống: {ex.Message}"
                });
            }
        }

        /// <summary>
        /// Xuất Excel đơn hàng với filter nâng cao
        /// </summary>
        /// <param name="model">Model xuất Excel với filter</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export-with-filter")]
        public async Task<ActionResult<OrderExportResult>> ExportOrdersWithFilter([FromBody] OrderExportWithFilterModel 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ệ");
                }

                // Kiểm tra template có được hỗ trợ không
                if (!_orderExportService.IsTemplateSupported(model.TemplateType))
                {
                    return BadRequest($"Template {model.GetTemplateTypeName()} chưa được hỗ trợ");
                }

                // 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 _orderExportService.ExportOrdersWithFilterAsync(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 OrderExportResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi hệ thống: {ex.Message}"
                });
            }
        }

        /// <summary>
        /// Xuất Excel đơn hàng theo template Finance (backward compatibility)
        /// </summary>
        /// <param name="orderIds">Danh sách ID đơn hàng</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export-finance")]
        public async Task<ActionResult<OrderExportResult>> ExportFinanceOrders([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 OrderExportModel
                {
                    TemplateType = OrderExportTemplateType.Finance,
                    OrderIds = orderIds,
                    FileName = $"DanhSachDonHang_TaiChinh_{DateTime.Now:yyyyMMdd_HHmmss}",
                    UpdatedBy = currentUser.UserId,
                    UpdatedByUserName = currentUser.UserName
                };

                // Gọi service xuất Excel
                var result = await _orderExportService.ExportOrdersAsync(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 OrderExportResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi hệ thống: {ex.Message}"
                });
            }
        }

        /// <summary>
        /// Xuất Excel đơn hàng theo template Basic
        /// </summary>
        /// <param name="orderCodes">Danh sách mã đơn hàng</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("export-basic")]
        public async Task<ActionResult<OrderExportResult>> ExportBasicOrders([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 OrderExportModel
                {
                    TemplateType = OrderExportTemplateType.Basic,
                    OrderCodes = orderCodes,
                    FileName = $"DanhSachDonHang_CoBan_{DateTime.Now:yyyyMMdd_HHmmss}",
                    UpdatedBy = currentUser.UserId,
                    UpdatedByUserName = currentUser.UserName
                };

                // Gọi service xuất Excel
                var result = await _orderExportService.ExportOrdersAsync(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 OrderExportResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi hệ thống: {ex.Message}"
                });
            }
        }

        /// <summary>
        /// Lấy danh sách template có sẵn
        /// </summary>
        /// <returns>Danh sách template</returns>
        [HttpGet("templates")]
        public ActionResult<List<OrderExportTemplateInfo>> GetAvailableTemplates()
        {
            try
            {
                var templates = _orderExportService.GetAvailableTemplates();
                return Ok(templates);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi khi lấy danh sách template: {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/OrderExport/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}");
            }
        }
    }
}
