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 Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller tổng hợp cho việc xuất Excel các phiếu tài chính
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class FinanceExcelExportController : ControllerBase
    {
        private readonly IReconciliationExcelService _reconciliationExcelService;
        private readonly ITransferPaymentBillExcelService _transferPaymentBillExcelService;

        public FinanceExcelExportController(
            IReconciliationExcelService reconciliationExcelService,
            ITransferPaymentBillExcelService transferPaymentBillExcelService)
        {
            _reconciliationExcelService = reconciliationExcelService;
            _transferPaymentBillExcelService = transferPaymentBillExcelService;
        }

        #region Reconciliation Excel Export

        /// <summary>
        /// Xuất Excel danh sách phiếu đối soát
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("Reconciliation/Export")]
        [Authorize(Roles = "Reconciliation.ExportExcel")]
        public async Task<IActionResult> ExportReconciliations([FromBody] ReconciliationExcelExportModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

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

                var result = await _reconciliationExcelService.ExportReconciliationsAsync(model);

                if (result.Result == Result.Success)
                {
                    // Sử dụng URL từ ExcelFileService, nếu không có thì tạo fallback URL
                    if (string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                    }

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

        /// <summary>
        /// Xuất Excel chi tiết phiếu đối soát
        /// </summary>
        /// <param name="reconciliationId">ID phiếu đối soát</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("Reconciliation/ExportDetail/{reconciliationId}")]
        [Authorize(Roles = "Reconciliation.ExportExcel")]
        public async Task<IActionResult> ExportReconciliationDetail(int reconciliationId, [FromBody] ReconciliationExcelExportModel model)
        {
            try
            {
                if (reconciliationId <= 0)
                {
                    return BadRequest("ID phiếu đối soát không hợp lệ");
                }

                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

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

                var result = await _reconciliationExcelService.ExportReconciliationDetailAsync(reconciliationId, model);

                if (result.Result == Result.Success)
                {
                    // Sử dụng URL từ ExcelFileService, nếu không có thì tạo fallback URL
                    if (string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                    }

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

        #endregion

        #region Transfer Payment Bill Excel Export

        /// <summary>
        /// Xuất Excel danh sách phiếu chuyển khoản
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("TransferPaymentBill/Export")]
        [Authorize(Roles = "TransferPaymentBill.ExportExcel")]
        public async Task<IActionResult> ExportTransferPaymentBills([FromBody] TransferPaymentBillExcelExportModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

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

                var result = await _transferPaymentBillExcelService.ExportTransferPaymentBillsAsync(model);

                if (result.Result == Result.Success)
                {
                    // Sử dụng URL từ ExcelFileService, nếu không có thì tạo fallback URL
                    if (string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                    }

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

        /// <summary>
        /// Xuất Excel chi tiết phiếu chuyển khoản
        /// </summary>
        /// <param name="transferPaymentBillId">ID phiếu chuyển khoản</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("TransferPaymentBill/ExportDetail/{transferPaymentBillId}")]
        [Authorize(Roles = "TransferPaymentBill.ExportExcel")]
        public async Task<IActionResult> ExportTransferPaymentBillDetail(int transferPaymentBillId, [FromBody] TransferPaymentBillExcelExportModel model)
        {
            try
            {
                if (transferPaymentBillId <= 0)
                {
                    return BadRequest("ID phiếu chuyển khoản không hợp lệ");
                }

                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

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

                var result = await _transferPaymentBillExcelService.ExportTransferPaymentBillDetailAsync(transferPaymentBillId, model);

                if (result.Result == Result.Success)
                {
                    // Sử dụng URL từ ExcelFileService, nếu không có thì tạo fallback URL
                    if (string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                    {
                        var fileName = Path.GetFileName(result.FilePath);
                        result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                    }

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


        /// <summary>
        /// Xuất Excel danh sách đơn hàng nợ cước của khách hàng
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("TransferPaymentBill/ExportCustomerTransferableOrdersExcel")]
        [Authorize(Roles = "TransferPaymentBill.ExportCustomerTransferableOrdersExcel")]
        public async Task<IActionResult> ExportCustomerTransferableOrdersExcel([FromBody] CustomerTransferableOrdersExcelExportModel model)
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                if (currentUser == null)
                {
                    return Unauthorized("Không xác định được người dùng");
                }

                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

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

                var result = await _transferPaymentBillExcelService.ExportCustomerTransferableOrdersAsync(model);

                if (result.Result == Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return BadRequest(new TransferPaymentBillExcelExportResult
                {
                    Result = Result.SystemError,
                    Message = $"Lỗi khi xuất Excel: {ex.Message}"
                });
            }
        }


        #endregion

        #region Common Operations

        /// <summary>
        /// Download file Excel đã xuất
        /// </summary>
        /// <param name="fileName">Tên file</param>
        /// <returns>File Excel</returns>
        [HttpGet("Download/{fileName}")]
        [Authorize]
        public async Task<IActionResult> DownloadFile(string fileName)
        {
            try
            {
                // Tìm file trong các thư mục export
                var possiblePaths = new[]
                {
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "reconciliations", fileName),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "transfer-payment-bills", fileName),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", fileName)
                };

                string? filePath = null;
                foreach (var path in possiblePaths)
                {
                    if (System.IO.File.Exists(path))
                    {
                        filePath = path;
                        break;
                    }
                }

                if (string.IsNullOrEmpty(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")]
        [Authorize]
        public ActionResult<List<object>> GetExportedFiles()
        {
            try
            {
                var exportFolders = new[]
                {
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "reconciliations"),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "transfer-payment-bills"),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports")
                };

                var allFiles = new List<object>();

                foreach (var folder in exportFolders)
                {
                    if (Directory.Exists(folder))
                    {
                        var files = Directory.GetFiles(folder, "*.xlsx")
                            .Select(filePath => new
                            {
                                FileName = Path.GetFileName(filePath),
                                FileSize = new FileInfo(filePath).Length,
                                CreatedTime = System.IO.File.GetCreationTime(filePath),
                                DownloadUrl = $"/api/FinanceExcelExport/Download/{Path.GetFileName(filePath)}",
                                Type = GetFileType(folder)
                            })
                            .ToList();

                        allFiles.AddRange(files);
                    }
                }

                return Ok(allFiles.OrderByDescending(f => ((dynamic)f).CreatedTime).ToList());
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi khi lấy danh sách file: {ex.Message}");
            }
        }

        /// <summary>
        /// Xóa file Excel đã xuất
        /// </summary>
        /// <param name="fileName">Tên file</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("Delete/{fileName}")]
        [Authorize(Roles = "FinanceExcelExport.Delete")]
        public IActionResult DeleteFile(string fileName)
        {
            try
            {
                // Tìm file trong các thư mục export
                var possiblePaths = new[]
                {
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "reconciliations", fileName),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", "transfer-payment-bills", fileName),
                    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports", fileName)
                };

                string? filePath = null;
                foreach (var path in possiblePaths)
                {
                    if (System.IO.File.Exists(path))
                    {
                        filePath = path;
                        break;
                    }
                }

                if (string.IsNullOrEmpty(filePath))
                {
                    return NotFound("File không tồn tại");
                }

                System.IO.File.Delete(filePath);

                return Ok(new { Message = "Xóa file thành công" });
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi khi xóa file: {ex.Message}");
            }
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Xác định loại file dựa trên thư mục
        /// </summary>
        private string GetFileType(string folderPath)
        {
            if (folderPath.Contains("reconciliations"))
                return "Phiếu đối soát";
            else if (folderPath.Contains("transfer-payment-bills"))
                return "Phiếu chuyển khoản";
            else
                return "Khác";
        }

        #endregion
    }
}
