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

namespace Ladaer.BackEnd.Controllers.Systems
{

    /// <summary>
    /// Controller xử lý các yêu cầu liên quan đến kho hàng.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class WarehouseController : ControllerBase
    {
        private readonly IWarehouseService _warehouseService;
        private readonly IUserService _userService;

        /// <summary>
        /// Khởi tạo một thể hiện mới của lớp <see cref="WarehouseController"/>.
        /// </summary>
        /// <param name="userService">Dịch vụ người dùng.</param>
        /// <param name="warehouseService">Dịch vụ kho hàng.</param>
        public WarehouseController(IUserService userService, IWarehouseService warehouseService)
        {
            _userService = userService;
            _warehouseService = warehouseService;
        }

        /// <summary>
        /// Xử lý yêu cầu nhập kho cho một đơn hàng.
        /// </summary>
        /// <param name="model">Mô hình chứa thông tin đơn hàng.</param>
        /// <returns>Kết quả của quá trình nhập kho.</returns>
        [HttpPost("Inbound")]
        [Authorize(Roles = "Warehouse.Inbound")]
        public async Task<IActionResult> Inbound([FromBody] InboundModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không có người dùng");
            }
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var userInfo = await _userService.GetByIdAsync(currentUser.UserId);
            if (userInfo == null || userInfo.Id <= 0 || userInfo.IsLocked)
            {
                return BadRequest("Tài khoản không hợp lệ!");
            }
            model.UpdatedBy = userInfo.Id;
            model.UpdatedByUserName = userInfo.UserName;

            var result = await _warehouseService.Inbound(model);
            return Ok(result);
        }

        /// <summary>
        /// Tìm kiếm danh sách tài xế theo từ khóa và phân trang.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm tài xế.</param>
        /// <param name="pageNumber">Số trang cho phân trang.</param>
        /// <param name="pageSize">Kích thước trang cho phân trang.</param>
        /// <returns>Danh sách các tài xế phù hợp với từ khóa tìm kiếm.</returns>
        [HttpGet("SearchDrivers")]
        [Authorize(Roles = "Warehouse.SearchDrivers")]
        public async Task<IActionResult> SearchDrivers(string keyword = "", int pageNumber = 1, int pageSize = 10)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không có người dùng");
            }
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var userInfo = await _userService.GetByIdAsync(currentUser.UserId);
            if (userInfo == null || userInfo.Id <= 0 || userInfo.IsLocked)
            {
                return BadRequest("Tài khoản không hợp lệ!");
            }
            keyword = string.IsNullOrEmpty(keyword) ? "" : keyword.Trim();
            pageNumber = pageNumber < 0 ? 1 : pageNumber;
            pageSize = pageSize < 0 ? 10 : pageSize;
            var result = await _warehouseService.SearchDriversAsync(userInfo.AgencyId, keyword, pageNumber, pageSize);
            return Ok(result);
        }


        /// <summary>
        /// Lấy danh sách đơn hàng cần inbound của một tài xế.
        /// </summary>
        /// <param name="userId">Id của tài xế.</param>
        /// <param name="pageNumber">Số trang.</param>
        /// <param name="pageSize">Số bản ghi / trang.</param>
        /// <returns>Danh sách các đơn hàng cần inbound.</returns>
        [HttpGet("GetInboundOrders")]
        [Authorize(Roles = "Warehouse.GetInboundOrdersByDriversAsync")]
        public async Task<IActionResult> GetInboundOrdersByDriversAsync(int userId, int pageNumber = 1, int pageSize = 10)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không có người dùng");
            }
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var userInfo = await _userService.GetByIdAsync(currentUser.UserId);
            if (userInfo == null || userInfo.Id <= 0 || userInfo.IsLocked)
            {
                return BadRequest("Tài khoản không hợp lệ!");
            }
            pageNumber = pageNumber < 0 ? 1 : pageNumber;
            pageSize = pageSize < 0 ? 10 : pageSize;

            var result = await _warehouseService.GetInboundOrdersByDriversAsync(userId, pageNumber, pageSize);
            return Ok(result);
        }
    }
}
