using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Lada.Framework.Infrastructures.Services;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;
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
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class CustomerReconciliationSlipController : ControllerBase
    {
        private readonly ICustomerReconciliationSlipService _service;
        private readonly IUserService _userService;
        private readonly ICustomerReconciliationSlipExcelService _excelService;

        public CustomerReconciliationSlipController(
            ICustomerReconciliationSlipService service,
            IUserService userService,
            ICustomerReconciliationSlipExcelService excelService)
        {
            _service = service;
            _userService = userService;
            _excelService = excelService;
        }

        /// <summary>
        /// Lấy danh sách khách hàng cần đối soát
        /// </summary>
        [HttpPost("GetCustomersOverview")]
        [Authorize(Roles = "CustomerReconciliationSlip.View,CustomerReconciliationSlip.Create,Founder")]
        public async Task<SmartTableResult<CustomerTransferPaymentSummaryItem>> GetCustomersOverview([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            return await _service.GetCustomersOverviewAsync(param, currentUser.UserId);
        }

        /// <summary>
        /// Lấy danh sách đơn hàng có thể đối soát của khách hàng
        /// </summary>
        [HttpGet("GetReconciliableOrders")]
        [Authorize(Roles = "CustomerReconciliationSlip.View,CustomerReconciliationSlip.Create,Founder")]
        public async Task<List<CustomerReconciliationSlipDetailItem>> GetReconciliableOrders(int customerId)
        {
            var currentUser = User.GetCurrentUser();
            return await _service.GetReconciliableOrdersAsync(customerId, currentUser.UserId);
        }

        /// <summary>
        /// Tạo phiếu đối soát khách hàng
        /// </summary>
        /// <remarks>
        /// API này tạo phiếu đối soát cho khách hàng dựa trên danh sách đơn hàng được chọn.
        /// 
        /// **Endpoint:** POST /api/CustomerReconciliationSlip/Create
        /// 
        /// **Business Logic:**
        /// - Validate quyền: Chỉ Founder hoặc Manager của khách hàng mới được tạo phiếu
        /// - Validate đơn hàng: Tất cả đơn phải tồn tại và thuộc về khách hàng
        /// - Kiểm tra locking: Đơn hàng không được nằm trong phiếu đối soát khác (trừ phiếu đã bị từ chối)
        /// - Tính toán tự động:
        ///   + TotalCodAmount: Tổng tiền COD của các đơn
        ///   + TotalFeeAmount: Tổng phí vận chuyển của các đơn
        ///   + FinalAmount: |TotalCodAmount - TotalFeeAmount|
        ///   + Type: Receivable (nếu COD >= Fee) hoặc Payable (nếu COD < Fee)
        /// - Trạng thái ban đầu: PendingApproval (Chờ duyệt)
        /// - Tự động sinh mã phiếu: CR-YYMMDD-XXXX
        /// - Ghi log hành động tạo phiếu
        /// - Upload ảnh chứng từ: Bắt buộc cho phiếu âm (Payable - khách chuyển khoản cho công ty)
        /// 
        /// **Authorization:**
        /// - Roles: CustomerReconciliationSlip.Create hoặc Founder
        /// - Permission check: Manager chỉ tạo phiếu cho khách hàng mình quản lý
        /// </remarks>
        /// <param name="model">Thông tin tạo phiếu đối soát (CustomerId, OrderIds, InternalNote, Files)</param>
        /// <returns>
        /// Success (200): { "Id": int, "Message": "Tạo phiếu thành công" }
        /// Error (400/403/500): Exception message
        /// </returns>
        [HttpPost("Create")]
        [Authorize(Roles = "CustomerReconciliationSlip.Create,Founder")]
        public async Task<IActionResult> Create([FromForm] CreateCustomerReconciliationSlipModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

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

            var id = await _service.CreateSlipAsync(model, currentUser);
            return Ok(new { Id = id, Message = "Tạo phiếu thành công" });
        }

        /// <summary>
        /// Tìm kiếm phiếu đối soát
        /// </summary>
        [HttpPost("Search")]
        [Authorize(Roles = "CustomerReconciliationSlip.View,Founder")]
        public async Task<SmartTableResult<CustomerReconciliationSlipItem>> Search([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            return await _service.GetSlipsAsync(param, currentUser.UserId);
        }

        /// <summary>
        /// Lấy chi tiết phiếu
        /// </summary>
        [HttpGet("GetById/{id}")]
        [Authorize(Roles = "CustomerReconciliationSlip.View,Founder")]
        public async Task<CustomerReconciliationSlipResult> GetById(int id)
        {
            var currentUser = User.GetCurrentUser();
            return await _service.GetSlipByIdAsync(id, currentUser.UserId);
        }

        /// <summary>
        /// Duyệt phiếu (Kế toán)
        /// </summary>
        [HttpPut("Approve/{id}")]
        [Authorize(Roles = "CustomerReconciliationSlip.Approve,Founder")]
        public async Task<IActionResult> Approve(int id)
        {
            var currentUser = User.GetCurrentUser();
            await _service.ApproveSlipAsync(id, currentUser);
            return Ok(new { Message = "Duyệt phiếu thành công" });
        }

        /// <summary>
        /// Từ chối phiếu (Kế toán)
        /// </summary>
        [HttpPost("Reject")]
        [Authorize(Roles = "CustomerReconciliationSlip.Reject,Founder")]
        public async Task<IActionResult> Reject([FromBody] RejectCustomerReconciliationSlipModel model)
        {
            var currentUser = User.GetCurrentUser();
            await _service.RejectSlipAsync(model, currentUser);
            return Ok(new { Message = "Từ chối phiếu thành công" });
        }

        /// <summary>
        /// Hoàn thành phiếu (Xác nhận thanh toán)
        /// </summary>
        [HttpPost("Complete")]
        [Authorize(Roles = "CustomerReconciliationSlip.Complete,Founder")]
        public async Task<IActionResult> Complete([FromBody] CompleteCustomerReconciliationSlipModel model)
        {
            var currentUser = User.GetCurrentUser();
            await _service.CompleteSlipAsync(model, currentUser);
            return Ok(new { Message = "Xác nhận thanh toán thành công" });
        }

        /// <summary>
        /// Lấy lịch sử thao tác
        /// </summary>
        [HttpGet("GetLogs/{id}")]
        [Authorize(Roles = "CustomerReconciliationSlip.View,Founder")]
        public async Task<List<CustomerReconciliationLogItem>> GetLogs(int id)
        {
            var currentUser = User.GetCurrentUser();
            return await _service.GetSlipLogsAsync(id, currentUser.UserId);
        }

        #region Excel Export

        /// <summary>
        /// Xuất Excel danh sách phiếu đối soát khách hàng
        /// </summary>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("ExportExcel")]
        [Authorize(Roles = "CustomerReconciliationSlip.ExportExcel,Founder")]
        public async Task<IActionResult> ExportExcel([FromBody] CustomerReconciliationSlipExcelExportModel 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;

                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    return BadRequest(string.Join("; ", validationErrors));
                }

                // Gọi service để xuất Excel
                var result = await _excelService.ExportCustomerReconciliationSlipsAsync(model);

                // Tạo download URL nếu chưa có
                if (result.Result == Result.Success && string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                {
                    var fileName = Path.GetFileName(result.FilePath);
                    result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                }

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

        /// <summary>
        /// Xuất Excel chi tiết phiếu đối soát khách hàng
        /// </summary>
        /// <param name="slipId">ID phiếu đối soát</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("ExportExcelDetail/{slipId}")]
        [Authorize(Roles = "CustomerReconciliationSlip.ExportExcel,Founder")]
        public async Task<IActionResult> ExportExcelDetail(int slipId, [FromBody] CustomerReconciliationSlipExcelExportModel model)
        {
            try
            {
                if (slipId <= 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;

                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    return BadRequest(string.Join("; ", validationErrors));
                }

                // Kiểm tra trạng thái của phiếu đối soát
                var slip = await _service.GetSlipByIdAsync(slipId, currentUser.UserId);
                if (slip == null || slip.Slip == null)
                {
                    return NotFound("Không tìm thấy phiếu đối soát");
                }

                if (slip.Slip.Status == Lada.Framework.Data.Domains.Finance.CustomerReconciliationSlipStatus.Rejected)
                {
                    return BadRequest("Không thể xuất Excel cho phiếu đối soát đã bị từ chối");
                }

                // Gọi service để xuất Excel chi tiết
                var result = await _excelService.ExportCustomerReconciliationSlipDetailAsync(slipId, model);

                // Tạo download URL nếu chưa có
                if (result.Result == Result.Success && string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                {
                    var fileName = Path.GetFileName(result.FilePath);
                    result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                }

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

        /// <summary>
        /// Xuất Excel danh sách đơn hàng cần đối soát của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <param name="model">Model xuất Excel</param>
        /// <returns>Kết quả xuất file</returns>
        [HttpPost("ExportReconciliableOrders/{customerId}")]
        [Authorize(Roles = "CustomerReconciliationSlip.ExportExcel,Founder")]
        public async Task<IActionResult> ExportReconciliableOrders(int customerId, [FromBody] CustomerReconciliationSlipExcelExportModel model)
        {
            try
            {
                if (customerId <= 0)
                {
                    return BadRequest("ID khách hàng 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;

                // Validate model
                var validationErrors = model.Validate();
                if (validationErrors.Any())
                {
                    return BadRequest(string.Join("; ", validationErrors));
                }

                // Gọi service để xuất Excel
                var result = await _excelService.ExportReconciliableOrdersAsync(customerId, currentUser.UserId, model);

                // Tạo download URL nếu chưa có
                if (result.Result == Result.Success && string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
                {
                    var fileName = Path.GetFileName(result.FilePath);
                    result.DownloadUrl = $"/api/FinanceExcelExport/Download/{fileName}";
                }

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

        #endregion
    }
}
