using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Hr;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Export;
using Ladaer.BackEnd.Infrastructures.Services.Hr;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Hr
{
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class AttendanceController : ControllerBase
    {
        private readonly IAttendanceService _attendanceService;
        private readonly IWebHostEnvironment _hostEnvironment;

        public AttendanceController(IAttendanceService attendanceService, IWebHostEnvironment hostEnvironment)
        {
            _attendanceService = attendanceService;
            _hostEnvironment = hostEnvironment;
        }

        [HttpPost("Punch")]
        [Authorize(Roles = "Attendance.PunchAsync")]
        public async Task<IActionResult> PunchAsync([FromForm] CheckInOutModel 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 d?nh du?c ngu?i d�ng");
            }
            model.UserId = model.UpdatedBy;

            var result = await _attendanceService.PunchAsync(model);
            return Ok(result);
        }



        [HttpPost("search")]
        [Authorize(Roles = "Attendance.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _attendanceService.SearchAsync(param);
            return Ok(result);
        }

        /// <summary>
        /// Xu?t danh s�ch ch?m c�ng ra file Excel.
        /// </summary>
        /// <param name="param">Tham s? t�m ki?m.</param>
        /// <returns>K?t qu? xu?t file Excel.</returns>
        [HttpPost("ExportToExcel")]
        [Authorize(Roles = "Attendance.ExportToExcel")]
        public async Task<IActionResult> ExportToExcel([FromBody] SmartTableParam param)
        {
            var filePath = InitFilePath();
            var result = new ExportResult();

            if (!string.IsNullOrEmpty(filePath))
            {
                result = await _attendanceService.ExportToExcelAsync(param, filePath);
                if (!string.IsNullOrEmpty(result.Url))
                {
                    result.Url = ConvertToUrl(result.Url);
                }
            }
            else
            {
                result.Result = Result.Failed;
                result.Message = "Kh�ng l?y du?c du?ng d?n";
            }

            return Ok(result);
        }

        /// <summary>
        /// Lấy tổng hợp số công của tất cả nhân viên theo tháng.
        /// </summary>
        /// <param name="month">Tháng (1-12).</param>
        /// <param name="year">Năm (ví dụ: 2025).</param>
        /// <returns>Danh sách tổng hợp số công của nhân viên.</returns>
        [HttpGet("GetMonthlySummary")]
        [Authorize(Roles = "Attendance.GetMonthlySummary")]
        public async Task<IActionResult> GetMonthlySummary([FromQuery] int month, [FromQuery] int year)
        {
            if (month < 1 || month > 12)
            {
                return BadRequest("Tháng không hợp lệ. Vui lòng nhập từ 1 đến 12.");
            }

            if (year < 2000 || year > 2100)
            {
                return BadRequest("Năm không hợp lệ.");
            }

            var result = await _attendanceService.GetAttendanceSummaryByMonthAsync(month, year);
            return Ok(result);
        }

        /// <summary>
        /// Lấy chi tiết công từng ngày của một nhân viên theo tháng.
        /// </summary>
        /// <param name="month">Tháng (1-12).</param>
        /// <param name="year">Năm (ví dụ: 2025).</param>
        /// <param name="userId">ID nhân viên.</param>
        /// <returns>Danh sách chi tiết công từng ngày của nhân viên.</returns>
        [HttpGet("GetUserAttendanceDetail")]
        [Authorize(Roles = "Attendance.GetUserAttendanceDetail")]
        public async Task<IActionResult> GetUserAttendanceDetail([FromQuery] int month, [FromQuery] int year, [FromQuery] int userId)
        {
            if (month < 1 || month > 12)
            {
                return BadRequest("Tháng không hợp lệ. Vui lòng nhập từ 1 đến 12.");
            }

            if (year < 2000 || year > 2100)
            {
                return BadRequest("Năm không hợp lệ.");
            }

            if (userId <= 0)
            {
                return BadRequest("ID nhân viên không hợp lệ.");
            }

            var result = await _attendanceService.GetAttendanceDetailByUserAsync(month, year, userId);
            return Ok(result);
        }

        #region Utilities
        /// <summary>
        /// Kh?i t?o du?ng d?n t?p.
        /// </summary>
        /// <returns>�u?ng d?n t?p.</returns>
        private string InitFilePath()
        {
            try
            {
                var currentUser = User.GetCurrentUser();
                string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
                string webRootPath = _hostEnvironment.WebRootPath;
                string folderPath = Path.Combine(webRootPath, currentUser.UserName,
                                        DateTime.Now.Year.ToString(),
                                        DateTime.Now.Month.ToString(),
                                        DateTime.Now.Day.ToString());
                Directory.CreateDirectory(folderPath);

                return Path.Combine(folderPath, $"attendance_{timestamp}.xlsx");
            }
            catch (Exception)
            {
                return "";
            }
        }

        /// <summary>
        /// Chuy?n d?i du?ng d?n file th�nh URL.
        /// </summary>
        /// <param name="filePath">�u?ng d?n file.</param>
        /// <returns>URL.</returns>
        private string ConvertToUrl(string filePath)
        {
            try
            {
                string webRootPath = _hostEnvironment.WebRootPath;
                string relativePath = Path.GetRelativePath(webRootPath, filePath);
                return "/" + relativePath.Replace("\\", "/");
            }
            catch (Exception)
            {
                return "";
            }
        }
        #endregion
    }
}
