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

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller quản lý danh mục chi phí
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class ExpenseCategoryController : ControllerBase
    {
        private readonly IExpenseCategoryService _expenseCategoryService;

        public ExpenseCategoryController(IExpenseCategoryService expenseCategoryService)
        {
            _expenseCategoryService = expenseCategoryService;
        }

        /// <summary>
        /// Tìm kiếm danh mục chi phí với phân trang
        /// </summary>
        /// <param name="param">Tham số tìm kiếm và phân trang</param>
        /// <returns>Danh sách danh mục chi phí</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "ExpenseCategory.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            try
            {
                var result = await _expenseCategoryService.Search(param);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh mục chi phí theo ID
        /// </summary>
        /// <param name="id">ID danh mục chi phí</param>
        /// <returns>Thông tin danh mục chi phí</returns>
        [HttpGet("{id}")]
        [Authorize(Roles = "ExpenseCategory.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID không hợp lệ");
            }

            try
            {
                var result = await _expenseCategoryService.GetByIdAsync(id);
                if (result == null)
                {
                    return NotFound("Không tìm thấy danh mục chi phí");
                }

                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Tạo hoặc cập nhật danh mục chi phí
        /// </summary>
        /// <param name="model">Thông tin danh mục chi phí</param>
        /// <returns>Kết quả tạo hoặc cập nhật</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "ExpenseCategory.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] ExpenseCategoryModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

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

            try
            {
                var result = await _expenseCategoryService.CreateOrUpdateAsync(model, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Xóa danh mục chi phí
        /// </summary>
        /// <param name="id">ID danh mục chi phí</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("{id}")]
        [Authorize(Roles = "ExpenseCategory.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID không hợp lệ");
            }

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

            try
            {
                var result = await _expenseCategoryService.DeleteAsync(id, currentUser);
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest(result);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh sách tất cả danh mục chi phí (cho dropdown)
        /// </summary>
        /// <returns>Danh sách danh mục chi phí</returns>
        [HttpGet("GetAll")]
        [Authorize(Roles = "ExpenseCategory.GetAll")]
        public async Task<IActionResult> GetAll()
        {
            try
            {
                var result = await _expenseCategoryService.GetAllAsync();
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Kiểm tra tên danh mục có trùng không
        /// </summary>
        /// <param name="name">Tên danh mục</param>
        /// <param name="excludeId">ID loại trừ (khi update)</param>
        /// <returns>True nếu tên đã tồn tại</returns>
        [HttpGet("CheckNameExists")]
        [Authorize(Roles = "ExpenseCategory.CheckNameExists")]
        public async Task<IActionResult> CheckNameExists(string name, int excludeId = 0)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                return BadRequest("Tên danh mục không được để trống");
            }

            try
            {
                var exists = await _expenseCategoryService.IsNameExistsAsync(name.Trim(), excludeId);
                return Ok(new { exists });
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh sách danh mục chi phí theo cây phân cấp
        /// </summary>
        /// <returns>Danh sách danh mục chi phí theo cây phân cấp</returns>
        [HttpGet("Hierarchy")]
        [Authorize(Roles = "ExpenseCategory.GetHierarchy")]
        public async Task<IActionResult> GetHierarchy()
        {
            try
            {
                var result = await _expenseCategoryService.GetHierarchyAsync();
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh sách danh mục gốc (không có ParentId)
        /// </summary>
        /// <returns>Danh sách danh mục gốc</returns>
        [HttpGet("RootCategories")]
        [Authorize(Roles = "ExpenseCategory.GetRootCategories")]
        public async Task<IActionResult> GetRootCategories()
        {
            try
            {
                var result = await _expenseCategoryService.GetRootCategoriesAsync();
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Lấy danh sách danh mục con theo ParentId
        /// </summary>
        /// <param name="parentId">ID danh mục cha</param>
        /// <returns>Danh sách danh mục con</returns>
        [HttpGet("Children/{parentId}")]
        [Authorize(Roles = "ExpenseCategory.GetChildren")]
        public async Task<IActionResult> GetChildren(int parentId)
        {
            if (parentId <= 0)
            {
                return BadRequest("ID danh mục cha không hợp lệ");
            }

            try
            {
                var result = await _expenseCategoryService.GetChildrenAsync(parentId);
                return Ok(result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }

        /// <summary>
        /// Kiểm tra có thể xóa danh mục không (không có danh mục con)
        /// </summary>
        /// <param name="id">ID danh mục</param>
        /// <returns>True nếu có thể xóa</returns>
        [HttpGet("CanDelete/{id}")]
        [Authorize(Roles = "ExpenseCategory.CanDelete")]
        public async Task<IActionResult> CanDelete(int id)
        {
            if (id <= 0)
            {
                return BadRequest("ID không hợp lệ");
            }

            try
            {
                var canDelete = await _expenseCategoryService.CanDeleteAsync(id);
                return Ok(new { canDelete });
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
            }
        }
    }
}
