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

namespace Ladaer.BackEnd.Controllers.Crm
{
    /// <summary>
    /// Controller dịch vụ xử lý các hoạt động liên quan đến khách hàng.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class CustomerController : ControllerBase
    {
        private readonly ICustomerService _customerService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="CustomerController"/>.
        /// </summary>
        /// <param name="customerService">Dịch vụ xử lý khách hàng.</param>
        public CustomerController(ICustomerService customerService)
        {
            _customerService = customerService;
        }

        #region SEARCH / AUTOCOMPLETE

        /// <summary>
        /// Tìm kiếm các khách hàng dựa trên các tham số được cung cấp.
        /// </summary>
        /// <param name="param">Các tham số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm.</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "Customer.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var currentUser = User.GetCurrentUser();
            var customers = await _customerService.Search(param,currentUser.UserId);
            return Ok(customers);
        }

        /// <summary>
        /// Gọi đến khách hàng dựa trên từ khóa.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách khách hàng phù hợp.</returns>
        [HttpGet("Suggest")]
        [Authorize(Roles = "Customer.Suggest")]
        public async Task<IActionResult> Suggest(string keyword)
        {
            var customers = await _customerService.Suggest(keyword);
            return Ok(customers);
        }

        #endregion

        #region CRUD

        /// <summary>
        /// Tạo hoặc cập nhật thông tin khách hàng.
        /// </summary>
        /// <param name="customerModel">Model chứa thông tin khách hàng.</param>
        /// <returns>Kết quả của hoạt động tạo hoặc cập nhật.</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "Customer.CreateOrUpdate")]
        public async Task<IActionResult> CreateOrUpdate([FromBody] CustomerModel customerModel)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            customerModel.UpdatedBy = currentUser.UserId;
            customerModel.UpdatedByUserName = currentUser.UserName;
            if (customerModel.UpdatedBy <= 0 || string.IsNullOrEmpty(customerModel.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _customerService.CreateOrUpdate(customerModel);
            return Ok(result);
        }

        /// <summary>
        /// Cập nhật thông tin thuộc tính của khách hàng.
        /// </summary>
        /// <param name="customerModel">Model chứa thông tin thuộc tính của khách hàng.</param>
        /// <returns>Kết quả của hoạt động cập nhật thuộc tính.</returns>
        [HttpPut("UpdateProp")]
        [Authorize(Roles = "Customer.UpdateProp")]
        public async Task<IActionResult> UpdateProp([FromBody] CustomerPropModel customerModel)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            customerModel.UpdatedBy = currentUser.UserId;
            customerModel.UpdatedByUserName = currentUser.UserName;
            if (customerModel.UpdatedBy <= 0 || string.IsNullOrEmpty(customerModel.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _customerService.UpdateCustomerProp(customerModel);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin thuộc tính của khách hàng dựa trên ID và loại thuộc tính.
        /// </summary>
        /// <param name="customerId">ID của khách hàng.</param>
        /// <param name="propType">Loại thuộc tính.</param>
        /// <returns>Thông tin thuộc tính của khách hàng.</returns>
        [HttpGet("GetProp")]
        [Authorize(Roles = "Customer.GetProp")]
        public async Task<IActionResult> GetProp(int customerId, PropType propType)
        {
            var result = await _customerService.GetCustomerProp(customerId, propType);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin chi tiết của một khách hàng dựa trên ID.
        /// </summary>
        /// <param name="id">ID của khách hàng.</param>
        /// <returns>Thông tin chi tiết của khách hàng.</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "Customer.GetById")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _customerService.GetById(id);
            return Ok(result);
        }

        /// <summary>
        /// Xóa một khách hàng dựa trên ID.
        /// </summary>
        /// <param name="id">ID của khách hàng.</param>
        /// <returns>Kết quả của hoạt động xóa.</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "Customer.Delete")]
        public async Task<IActionResult> Delete(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _customerService.Delete(id, currentUser);
            return Ok(result);
        }

        #endregion

        #region LOCK-UNLOCK

        /// <summary>
        /// Khóa một khách hàng.
        /// </summary>
        /// <param name="model">Model chứa thông tin khách hàng cần khóa.</param>
        /// <returns>Kết quả của hoạt động khóa.</returns>
        [HttpPut("Lock")]
        [Authorize(Roles = "Customer.Lock")]
        public async Task<IActionResult> Lock([FromBody] CustomerStatusModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _customerService.Lock(model.Id, currentUser);
            return Ok(result);
        }

        /// <summary>
        /// Mở khóa một khách hàng.
        /// </summary>
        /// <param name="model">Model chứa thông tin khách hàng cần mở khóa.</param>
        /// <returns>Kết quả của hoạt động mở khóa.</returns>
        [HttpPut("UnLock")]
        [Authorize(Roles = "Customer.UnLock")]
        public async Task<IActionResult> UnLock([FromBody] CustomerStatusModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return BadRequest("Không xác định được người dùng");
            }
            var result = await _customerService.UnLock(model.Id, currentUser);
            return Ok(result);
        }

        #endregion

        #region AssignManager

        /// <summary>
        /// Lấy thông tin người quản lý của một khách hàng dựa trên ID.
        /// </summary>
        /// <param name="id">ID của khách hàng.</param>
        /// <returns>Thông tin người quản lý của khách hàng.</returns>
        [HttpGet("GetManagerById")]
        [Authorize(Roles = "Customer.GetManagerById")]
        public async Task<IActionResult> GetManagerById(int id)
        {
            var result = await _customerService.GetManagerById(id);
            return Ok(result);
        }

        /// <summary>
        /// Gán người quản lý cho một khách hàng.
        /// </summary>
        /// <param name="model">Model chứa thông tin người quản lý cần gán.</param>
        /// <returns>Kết quả của hoạt động gán người quản lý.</returns>
        [HttpPut("AssignManager")]
        [Authorize(Roles = "Customer.AssignManager")]
        public async Task<IActionResult> AssignManager(AssignManagerModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;
            var result = await _customerService.AssignManager(model);
            return Ok(result);
        }

        #endregion
    }
}
