using Lada.Framework.Data.Domains.Trucks;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Data.Repositories;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Trucks;
using Ladaer.BackEnd.Infrastructures.Services.FuelCards;
using Ladaer.BackEnd.Infrastructures.Services.Identity;
using Ladaer.BackEnd.Infrastructures.Services.Trucks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.DriverApp
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class DriverTruckController : ControllerBase
    {
        private readonly ITruckService _truckService;
        private readonly ITruckActivityService _truckActivityService;
        private readonly IUserService _userService;
        private readonly IFuelRefillService _fuelRefillService;

        public DriverTruckController(
            ITruckService truckService,
            ITruckActivityService truckActivityService,
            IUserService userService,
            IFuelRefillService fuelRefillService)
        {
            _truckService = truckService;
            _truckActivityService = truckActivityService;
            _userService = userService;
            _fuelRefillService = fuelRefillService;
        }

        /// <summary>
        /// Lấy danh sách tất cả xe tải thuộc chi nhánh của người dùng hiện tại
        /// </summary>
        /// <returns>Danh sách tất cả xe tải thuộc chi nhánh</returns>
        [HttpGet("GetTrucksByAgency")]
        [Authorize(Roles = "DriverTruck.GetTrucksByAgency")]
        public async Task<IActionResult> GetTrucksByAgency()
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var agencyId = await _userService.GetAgencyIdByIdAsync(currentUser.UserId);
            if (agencyId <= 0)
            {
                return BadRequest("Người dùng không thuộc đơn vị nào");
            }

            var result = await _truckService.GetTruckByAgencyId(agencyId);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách xe tải có thể nhận (chưa có người phụ trách) thuộc chi nhánh
        /// </summary>
        /// <returns>Danh sách xe tải có thể nhận</returns>
        [HttpGet("GetAvailableTrucks")]
        [Authorize(Roles = "DriverTruck.GetAvailableTrucks")]
        public async Task<IActionResult> GetAvailableTrucks()
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var agencyId = await _userService.GetAgencyIdByIdAsync(currentUser.UserId);
            if (agencyId <= 0)
            {
                return BadRequest("Người dùng không thuộc đơn vị nào");
            }

            var result = await _truckActivityService.GetAvailableTrucks(agencyId);
            return Ok(result);
        }

        /// <summary>
        /// Nhận xe (Check-in) với upload hình ảnh
        /// </summary>
        /// <param name="model">Thông tin nhận xe</param>
        /// <returns>Kết quả nhận xe</returns>
        [HttpPost("CheckInTruck")]
        [Authorize(Roles = "DriverTruck.CheckInTruck")]
        public async Task<IActionResult> CheckInTruck([FromForm] TruckCheckInOutModel model)
        {
            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            if (model.UpdatedBy <= 0 || string.IsNullOrEmpty(model.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            // Lấy AgencyId từ thông tin người dùng
            var agencyId = await _userService.GetAgencyIdByIdAsync(currentUser.UserId);
            if (agencyId <= 0)
            {
                return BadRequest("Người dùng không thuộc đơn vị nào");
            }
            model.AgencyId = agencyId;

            var result = await _truckActivityService.CheckInTruck(model);
            return Ok(result);
        }

        /// <summary>
        /// Trả xe (Check-out) với upload hình ảnh
        /// </summary>
        /// <param name="model">Thông tin trả xe</param>
        /// <returns>Kết quả trả xe</returns>
        [HttpPost("CheckOutTruck")]
        [Authorize(Roles = "DriverTruck.CheckOutTruck")]
        public async Task<IActionResult> CheckOutTruck([FromForm] TruckCheckInOutModel model)
        {
            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            if (model.UpdatedBy <= 0 || string.IsNullOrEmpty(model.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            // Lấy AgencyId từ thông tin người dùng
            var agencyId = await _userService.GetAgencyIdByIdAsync(currentUser.UserId);
            if (agencyId <= 0)
            {
                return BadRequest("Người dùng không thuộc đơn vị nào");
            }
            model.AgencyId = agencyId;

            var result = await _truckActivityService.CheckOutTruck(model);
            return Ok(result);
        }

        /// <summary>
        /// Đổ dầu cho lái xe trên app mobile.
        /// Lái xe là người đang đăng nhập, xe là xe đang phụ trách (tự động xác định).
        /// Có thể chọn thẻ dầu hoặc đổ bằng tiền mặt, không cần chọn giao dịch.
        /// </summary>
        /// <param name="model">Thông tin đổ dầu</param>
        /// <returns>Kết quả đổ dầu</returns>
        [HttpPost("DriverFuelRefill")]
        [Authorize(Roles = "DriverTruck.DriverFuelRefill")]
        public async Task<IActionResult> DriverFuelRefill([FromForm] DriverFuelRefillModel model)
        {
            var currentUser = User.GetCurrentUser();

            if (currentUser.UserId <= 0 || string.IsNullOrEmpty(currentUser.UserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _fuelRefillService.DriverFuelRefill(model, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Lịch sử đổ dầu của lái xe (phân trang, lọc theo ngày và từ khóa)
        /// </summary>
        [HttpPost("SearchRefillHistory")]
        [Authorize(Roles = "DriverTruck.SearchRefillHistory")]
        public async Task<IActionResult> SearchRefillHistory([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();

            if (currentUser.UserId <= 0 || string.IsNullOrEmpty(currentUser.UserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _fuelRefillService.SearchByDriverAsync(currentUser.UserId, param);
            return Ok(result);
        }

        /// <summary>
        /// Kiểm tra xe hiện tại của người dùng
        /// </summary>
        /// <returns>Thông tin xe hiện tại</returns>
        [HttpGet("GetMyCurrentTruck")]
        [Authorize(Roles = "DriverTruck.GetMyCurrentTruck")]
        public async Task<IActionResult> GetMyCurrentTruck()
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser.UserId <= 0)
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _truckActivityService.GetCurrentUserTruck(currentUser.UserId);
            return Ok(result);
        }
    }
}
