using System.Threading.Tasks;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Accounts;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Hr;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Users;
using Ladaer.BackEnd.Infrastructures.Services.Hr;
using Ladaer.BackEnd.Infrastructures.Services.Identity;
using Ladaer.BackEnd.Infrastructures.Services.Report.OperationReports;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.DriverApp
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class DriverProfileController : ControllerBase
    {
        private readonly IUserService _userService;
        private readonly IAttendanceService _attendanceService;
        private readonly IDriverReportService _driverReportService;

        public DriverProfileController(
            IUserService userService,
            IAttendanceService attendanceService,
            IDriverReportService driverReportService)
        {
            _userService = userService;
            _attendanceService = attendanceService;
            _driverReportService = driverReportService;
        }

        /// <summary>
        /// Đăng nhập dành cho tài xế
        /// </summary>
        [HttpPost("Login")]
        [AllowAnonymous]
        public async Task<IActionResult> Login([FromBody] LoginModel model)
        {
            try
            {
                var result = await _userService.Login(model);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi đăng nhập");
            }
        }

        /// <summary>
        /// Đổi mật khẩu
        /// </summary>
        [HttpPost("ChangePassword")]
        public async Task<IActionResult> ChangePassword([FromBody] ChangePasswordModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null) return BadRequest("Không có người dùng");

            model.UserId = currentUser.UserId;

            try
            {
                var result = await _userService.ChangePassword(model);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi đổi mật khẩu");
            }
        }

        /// <summary>
        /// Gia hạn đăng nhập (Refresh Token)
        /// </summary>
        [HttpPost("RefreshToken")]
        public async Task<IActionResult> RefreshToken([FromBody] RefreshTokenModel model)
        {
            try
            {
                var result = await _userService.RefreshToken(model.RefreshToken, model.DeviceId);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi gia hạn đăng nhập");
            }
        }

        /// <summary>
        /// Cập nhật thông tin profile
        /// </summary>
        [HttpPost("UpdateProfile")]
        public async Task<IActionResult> UpdateProfile([FromBody] StaffModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null) return BadRequest("Không có người dùng");

            // Đảm bảo chỉ cập nhật đúng user đang đăng nhập
            model.Id = currentUser.UserId;
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            try
            {
                var result = await _userService.UpdateStaff(model);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi cập nhật thông tin");
            }
        }

        /// <summary>
        /// Chấm công (Check-in/Check-out)
        /// </summary>
        [HttpPost("Attendance")]
        public async Task<IActionResult> Attendance([FromForm] CheckInOutModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null) return BadRequest("Không có người dùng");

            model.UserId = currentUser.UserId;

            try
            {
                var result = await _attendanceService.PunchAsync(model);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi chấm công");
            }
        }

        /// <summary>
        /// Lấy bảng lương (Dựa trên báo cáo năng suất)
        /// </summary>
        [HttpPost("Payroll")]
        public async Task<IActionResult> GetPayroll([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null) return BadRequest("Không có người dùng");

            try
            {
                // Sử dụng báo cáo năng suất để hiển thị thông tin bảng lương/công việc
                var result = await _driverReportService.GetDriverProductivityReportByDateAsync(param, currentUser.UserId);
                return Ok(result);
            }
            catch (System.Exception ex)
            {
                return StatusCode(500, "Đã xảy ra lỗi khi lấy thông tin bảng lương");
            }
        }
    }
}
