using Lada.Framework.Data.Domains;
using Lada.Framework.Data.Domains.Categories;
using Lada.Framework.Data.Domains.Crm;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Enums;
using Lada.Framework.Data.Repositories;
using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Orders;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Crm;
using Ladaer.BackEnd.Infrastructures.Services.Identity;
using Microsoft.EntityFrameworkCore;

namespace Ladaer.BackEnd.Infrastructures.Services.Crm
{
    /// <summary>
    /// Giao diện cho dịch vụ quản lý khách hàng.
    /// </summary>
    public interface ICustomerService
    {
        /// <summary>
        /// Tìm kiếm khách hàng.
        /// </summary>
        /// <param name="param">Thông số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm khách hàng.</returns>
        Task<SmartTableResult<CustomerItem>> Search(SmartTableParam param);


        Task<SmartTableResult<CustomerItem>> Search(SmartTableParam param, int userId);

        /// <summary>
        /// Gợi ý danh sách khách hàng.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách khách hàng gợi ý.</returns>
        Task<List<CustomerSugItem>> Suggest(string keyword);

        /// <summary>
        /// Tạo hoặc cập nhật khách hàng.
        /// </summary>
        /// <param name="model">Thông tin khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<CustomerResult> CreateOrUpdate(CustomerModel model);

        /// <summary>
        /// Lấy thông tin khách hàng theo Id.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <returns>Thông tin khách hàng.</returns>
        Task<CustomerModel> GetById(int id);

        /// <summary>
        /// Xóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> Delete(int id, CurrentUser currentUser);

        /// <summary>
        /// Khóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> Lock(int id, CurrentUser currentUser);

        /// <summary>
        /// Mở khóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> UnLock(int id, CurrentUser currentUser);

        /// <summary>
        /// Gán người quản lý cho khách hàng.
        /// </summary>
        /// <param name="model">Thông tin người quản lý.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> AssignManager(AssignManagerModel model);

        /// <summary>
        /// Lấy thông tin người quản lý theo Id khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <returns>Thông tin người quản lý.</returns>
        Task<AssignManagerModel> GetManagerById(int id);

        /// <summary>
        /// Cập nhật thuộc tính của khách hàng.
        /// </summary>
        /// <param name="model">Thông tin thuộc tính của khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<BaseResult> UpdateCustomerProp(CustomerPropModel model);

        /// <summary>
        /// Lấy thông tin thuộc tính của khách hàng.
        /// </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>
        Task<CustomerPropModel> GetCustomerProp(int customerId, PropType propType);

        /// <summary>
        /// Cập nhật trạng thái khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="status">Trạng thái khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        Task<bool> UpdateCustomerStatus(int id, CustomerStatus status);

    }

    /// <summary>
    /// Triển khai dịch vụ quản lý khách hàng.
    /// </summary>
    public class CustomerService : ICustomerService
    {
        private readonly IRepository<Customer> _customerRepository;
        private readonly IRepository<Location> _locationRepository;
        private readonly IUserRepository<User> _userRepository;
        private readonly IUserService _userService;

        /// <summary>
        /// Khởi tạo một thể hiện của <see cref="CustomerService"/>.
        /// </summary>
        /// <param name="customerRepository">Đối tượng IRepository của Customer.</param>
        /// <param name="locationRepository">Đối tượng IRepository của Location.</param>
        /// <param name="userRepository">Đối tượng IUserRepository của User.</param>
        /// <param name="userService">Đối tượng IUserService.</param>
        public CustomerService(IRepository<Customer> customerRepository, IRepository<Location> locationRepository,
            IUserRepository<User> userRepository, IUserService userService)
        {
            _customerRepository = customerRepository;
            _locationRepository = locationRepository;
            _userRepository = userRepository;
            _userService = userService;
        }

        #region SEARCH
        /// <summary>
        /// Tìm kiếm khách hàng.
        /// </summary>
        /// <param name="param">Thông số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm khách hàng.</returns>
        public async Task<SmartTableResult<CustomerItem>> Search(SmartTableParam param)
        {
            var query = _customerRepository.Query().Where(c => !c.IsDefaultCustomer);
            if (param.Search.PredicateObject != null)
            {
                dynamic search = param.Search.PredicateObject;
                if (search.Keyword != null)
                {
                    string keyword = search.Keyword;
                    keyword = keyword.Trim().ToLower();
                    if (!string.IsNullOrEmpty(keyword))
                    {
                        query = query.Where(x => x.FullName.ToLower().Contains(keyword)
                                    || x.PhoneNumber.ToLower().Contains(keyword));
                    }
                }

                if (search.CreatedStart != null && search.CreatedEnd != null)
                {
                    DateTimeOffset start = search.CreatedStart;
                    DateTimeOffset end = search.CreatedEnd;
                    // Chuyển từ UTC sang local time (GMT+7) và lấy đầu/cuối ngày
                    DateTimeOffset startParam = start.ToLocalTime().StartOfDay();
                    DateTimeOffset endParam = end.ToLocalTime().EndOfDay();
                    query = query.Where(x => x.CreatedTime >= startParam && x.CreatedTime <= endParam);
                }

                if (search.Status != null)
                {
                    CustomerStatus status = search.Status;
                    query = query.Where(x => x.Status == status);
                }

                if (search.Manager != null)
                {
                    int manager = search.Manager;
                    if (manager == 1)
                    {
                        query = query.Where(x => x.ManagerId > 0);
                    }
                    else
                    {
                        query = query.Where(x => x.ManagerId == 0);
                    }
                }
                if (search.Account != null)
                {
                    int account = search.Account;
                    if (account == 1)
                    {
                        query = query.Where(x => x.UserId > 0);
                    }
                    else
                    {
                        query = query.Where(x => x.UserId == 0);
                    }
                }
            }
            param.Sort = new Sort() { Predicate = "Id", Reverse = true };
            var gridData = await query.ToSmartTableResultAsync(param, x => x.ToItem());
            if (gridData.Items.Any())
            {
                var managerIds = gridData.Items.Where(i => i.ManagerId > 0).Select(m => m.ManagerId).Distinct().ToList();
                if (managerIds.Any())
                {
                    var managers = _userRepository.Query().Where(u => managerIds.Contains(u.Id)).ToList();
                    foreach (var item in gridData.Items)
                    {
                        if (item.ManagerId > 0)
                        {
                            var manager = managers.FirstOrDefault(m => m.Id == item.ManagerId);
                            if (manager != null && manager.Id > 0)
                            {
                                item.ManagerUsername = manager.UserName;
                            }
                        }
                    }
                }
            }
            return gridData;
        }


        /// <summary>
        /// Tìm kiếm khách hàng.
        /// </summary>
        /// <param name="param">Thông số tìm kiếm.</param>
        /// <returns>Kết quả tìm kiếm khách hàng.</returns>
        public async Task<SmartTableResult<CustomerItem>> Search(SmartTableParam param, int userId)
        {

            SmartTableResult<CustomerItem> gridData = new SmartTableResult<CustomerItem>();
            if (userId <= 0)
            {
                return gridData;
            }

            var query = _customerRepository.Query().Where(c => !c.IsDefaultCustomer);

            var roles = await _userService.GetRolesAsync(userId);

            if (!roles.Any(r => r == "Founder"))
            {
                query = query.Where(o => o.ManagerId == userId);
            }


            if (param.Search.PredicateObject != null)
            {
                dynamic search = param.Search.PredicateObject;
                if (search.Keyword != null)
                {
                    string keyword = search.Keyword;
                    keyword = keyword.Trim().ToLower();
                    if (!string.IsNullOrEmpty(keyword))
                    {
                        query = query.Where(x => x.FullName.ToLower().Contains(keyword)
                                    || x.PhoneNumber.ToLower().Contains(keyword));
                    }
                }

                if (search.CreatedStart != null && search.CreatedEnd != null)
                {
                    DateTimeOffset start = search.CreatedStart;
                    DateTimeOffset end = search.CreatedEnd;
                    // Chuyển từ UTC sang local time (GMT+7) và lấy đầu/cuối ngày
                    DateTimeOffset startParam = start.ToLocalTime().StartOfDay();
                    DateTimeOffset endParam = end.ToLocalTime().EndOfDay();
                    query = query.Where(x => x.CreatedTime >= startParam && x.CreatedTime <= endParam);
                }

                if (search.Status != null)
                {
                    CustomerStatus status = search.Status;
                    query = query.Where(x => x.Status == status);
                }

                if (search.Manager != null)
                {
                    int manager = search.Manager;
                    if (manager == 1)
                    {
                        query = query.Where(x => x.ManagerId > 0);
                    }
                    else
                    {
                        query = query.Where(x => x.ManagerId == 0);
                    }
                }
                if (search.Account != null)
                {
                    int account = search.Account;
                    if (account == 1)
                    {
                        query = query.Where(x => x.UserId > 0);
                    }
                    else
                    {
                        query = query.Where(x => x.UserId == 0);
                    }
                }
            }
            param.Sort = new Sort() { Predicate = "Id", Reverse = true };
            gridData = await query.ToSmartTableResultAsync(param, x => x.ToItem());
            if (gridData.Items.Any())
            {
                var managerIds = gridData.Items.Where(i => i.ManagerId > 0).Select(m => m.ManagerId).Distinct().ToList();
                if (managerIds.Any())
                {
                    var managers = _userRepository.Query().Where(u => managerIds.Contains(u.Id)).ToList();
                    foreach (var item in gridData.Items)
                    {
                        if (item.ManagerId > 0)
                        {
                            var manager = managers.FirstOrDefault(m => m.Id == item.ManagerId);
                            if (manager != null && manager.Id > 0)
                            {
                                item.ManagerUsername = manager.UserName;
                            }
                        }
                    }
                }
            }
            return gridData;
        }

        /// <summary>
        /// Gợi ý danh sách khách hàng.
        /// </summary>
        /// <param name="keyword">Từ khóa tìm kiếm.</param>
        /// <returns>Danh sách khách hàng gợi ý.</returns>
        public async Task<List<CustomerSugItem>> Suggest(string keyword)
        {
            var result = new List<CustomerSugItem>();
            var limit = 25;
            var query = _customerRepository.Query().Where(c => !c.IsDefaultCustomer);
            keyword = !string.IsNullOrEmpty(keyword) ? keyword.Trim().ToLower() : "";
            if (!string.IsNullOrEmpty(keyword))
            {
                query = query.Where(c => c.PhoneNumber.Contains(keyword)
                || (!string.IsNullOrEmpty(c.UserName) && c.UserName.Contains(keyword))
                || (!string.IsNullOrEmpty(c.FullName) && c.FullName.Contains(keyword))
                );
            }
            result = query.OrderByDescending(c => c.CreatedTime).Take(limit).Select(c => c.ToSugItem()).ToList();

            return result;
        }
        #endregion

        #region CRUD
        /// <summary>
        /// Tạo hoặc cập nhật khách hàng.
        /// </summary>
        /// <param name="model">Thông tin khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<CustomerResult> CreateOrUpdate(CustomerModel model)
        {
            var customer = model.ToEntity();

            // Cập nhật thông tin chung của thực thể
            customer = customer.UpdateCommonInt(model.UpdatedBy, model.UpdatedByUserName);

            if (customer.Id > 0)
            {
                // Cập nhật
                return await Update(customer);
            }
            else
            {
                customer.ManagerId = model.UpdatedBy;
                // Thêm mới
                return await Create(customer);
            }
        }

        /// <summary>
        /// Cập nhật thuộc tính của khách hàng.
        /// </summary>
        /// <param name="model">Thông tin thuộc tính của khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> UpdateCustomerProp(CustomerPropModel model)
        {
            var result = new BaseResult() { Result = Result.Success };
            var needUpdate = false;

            if (model.Id <= 0)
            {
                result.Result = Result.Failed;
                result.Message = "Thông tin khách hàng không hợp lệ!";
                return result;
            }
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == model.Id);
            if (customerForUpdate == null || customerForUpdate.Id <= 0)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy khách hàng yêu cầu!";
                return result;
            }

            switch (model.PropType)
            {
                case PropType.FullName:
                    var newFullName = model.Value.Trim();
                    customerForUpdate.FullName = newFullName;
                    needUpdate = true;
                    break;
                case PropType.PhoneNumber:
                    var newPhoneNumber = model.Value.Trim();
                    customerForUpdate.PhoneNumber = newPhoneNumber;
                    needUpdate = true;
                    break;
                case PropType.Address:
                    var newAddress = model.Value.Trim();
                    customerForUpdate.Address = newAddress;
                    needUpdate = true;
                    break;
                case PropType.Email:
                    var newEmail = model.Value.Trim();
                    customerForUpdate.Email = newEmail;
                    needUpdate = true;
                    break;
                case PropType.Manager:
                    var newManager = int.Parse(model.Value.Trim());
                    customerForUpdate.ManagerId = newManager;
                    needUpdate = true;
                    break;
                case PropType.Status:
                    var newStatus = CustomerStatus.Actived;
                    var isNewStatus = Enum.TryParse(model.Value.Trim(), true, out newStatus);
                    if (isNewStatus)
                    {
                        customerForUpdate.Status = newStatus;
                        needUpdate = true;
                    }
                    break;
                default:
                    break;
            }
            if (needUpdate)
            {
                try
                {
                    await _customerRepository.UpdateAsync(customerForUpdate);
                }
                catch (Exception e)
                {
                    result.Result = Result.SystemError;
                    result.Message = e.ToString();
                }
            }
            return result;
        }

        /// <summary>
        /// Lấy thông tin thuộc tính của khách hàng.
        /// </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>
        public async Task<CustomerPropModel> GetCustomerProp(int customerId, PropType propType)
        {
            var result = new CustomerPropModel();
            var needUpdate = false;

            if (customerId <= 0)
            {
                return result;
            }
            var customer = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == customerId);
            if (customer == null || customer.Id <= 0)
            {
                return result;
            }

            result.Id = customer.Id;
            result.PropType = propType;

            switch (propType)
            {
                case PropType.FullName:
                    result.Value = customer.FullName;
                    break;
                case PropType.PhoneNumber:
                    result.Value = customer.PhoneNumber;
                    needUpdate = true;
                    break;
                case PropType.Address:
                    result.Value = customer.Address;
                    break;
                case PropType.Email:
                    result.Value = customer.Email;
                    break;
                case PropType.Manager:
                    result.Value = customer.ManagerId.ToString();
                    break;
                case PropType.Status:
                    result.Value = customer.Status.ToString();
                    break;
                default:
                    break;
            }

            return result;
        }

        /// <summary>
        /// Thêm mới khách hàng.
        /// </summary>
        /// <param name="customer">Thông tin khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        private async Task<CustomerResult> Create(Customer customer)
        {
            var result = new CustomerResult();
            try
            {

                var phoneCus = await _customerRepository.Query().FirstOrDefaultAsync(c => c.PhoneNumber == customer.PhoneNumber);
                var emailCus = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Email == customer.Email);
                if (phoneCus != null && phoneCus.Id > 0)
                {
                    result.Result = Result.Failed;
                    result.Message = "Số điện thoại đã tồn tại";
                    result.Id = 0;
                    return result;
                }
                if (emailCus != null && emailCus.Id > 0)
                {
                    result.Result = Result.Failed;
                    result.Message = "Email đã tồn tại";
                    result.Id = 0;
                    return result;
                }
                await _customerRepository.InsertAsync(customer);
                result.Id = customer.Id;
            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.ToString();
                result.Id = 0;
            }
            return result;
        }

        /// <summary>
        /// Cập nhật khách hàng.
        /// </summary>
        /// <param name="customer">Thông tin khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        private async Task<CustomerResult> Update(Customer customer)
        {
            var result = new CustomerResult() { Result = Result.Success };
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == customer.Id);
            if (customerForUpdate == null || customer.Id <= 0)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy khách hàng yêu cầu!";
                return result;
            }

            try
            {
                customerForUpdate.FullName = customer.FullName;
                customerForUpdate.PhoneNumber = customer.PhoneNumber;
                customerForUpdate.Address = customer.Address;
                customerForUpdate.Email = customer.Email;
                customerForUpdate.ZaloContact = customer.ZaloContact;
                customerForUpdate.FacebookContact = customer.FacebookContact;
                customerForUpdate.ManagerId = customer.ManagerId;
                // Cập nhật thông tin chung của thực thể
                customerForUpdate = customerForUpdate.UpdateCommonInt();

                await _customerRepository.UpdateAsync(customerForUpdate);
                result.Id = customerForUpdate.Id;
            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.ToString();
            }

            return result;
        }

        /// <summary>
        /// Lấy thông tin khách hàng theo Id.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <returns>Thông tin khách hàng.</returns>
        public async Task<CustomerModel> GetById(int id)
        {
            var result = new CustomerModel();
            if (id <= 0)
            {
                return result;
            }
            var customer = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customer == null || customer.Id <= 0)
            {
                return result;
            }
            var customerModel = customer.ToModel();
            if (customer.ManagerId > 0)
            {
                customerModel.Manager = await _userService.GetByIdAsync(customer.ManagerId);
            }
            return customerModel;
        }

        /// <summary>
        /// Xóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> Delete(int id, CurrentUser currentUser)
        {
            var result = new BaseResult() { Result = Result.Success };
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customerForUpdate == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy bản ghi yêu cầu";
                return result;
            }

            try
            {
                customerForUpdate.IsDeleted = true;
                customerForUpdate = customerForUpdate.UpdateCommonInt(currentUser.UserId, currentUser.UserName);
                await _customerRepository.UpdateAsync(customerForUpdate);
            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.Message;
            }

            return result;
        }
        #endregion

        #region Lock / Unlock
        /// <summary>
        /// Khóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> Lock(int id, CurrentUser currentUser)
        {
            var result = new BaseResult() { Result = Result.Success };
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customerForUpdate == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy bản ghi yêu cầu";
                return result;
            }
            try
            {
                customerForUpdate.Status = CustomerStatus.Stopped;
                customerForUpdate = customerForUpdate.UpdateCommonInt(currentUser.UserId, currentUser.UserName);
                await _customerRepository.UpdateAsync(customerForUpdate);

                if (customerForUpdate.UserId > 0)
                {
                    var customerAccount = await _userRepository.Query().FirstOrDefaultAsync(u => u.Id == customerForUpdate.UserId);
                    if (customerAccount != null && customerAccount.Id > 0)
                    {
                        customerAccount.LockoutEnabled = true;
                        customerAccount.LockoutEnd = DateTimeHelper.CurrentTime().AddYears(20);
                        await _userRepository.UpdateAsync(customerAccount);
                    }
                }

            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.Message;
            }

            return result;
        }

        /// <summary>
        /// Mở khóa khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="currentUser">Thông tin người dùng hiện tại.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> UnLock(int id, CurrentUser currentUser)
        {
            var result = new BaseResult() { Result = Result.Success };
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customerForUpdate == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy bản ghi yêu cầu";
                return result;
            }
            try
            {
                customerForUpdate.Status = CustomerStatus.Actived;
                customerForUpdate = customerForUpdate.UpdateCommonInt(currentUser.UserId, currentUser.UserName);
                await _customerRepository.UpdateAsync(customerForUpdate);

                if (customerForUpdate.UserId > 0)
                {
                    var customerAccount = await _userRepository.Query().FirstOrDefaultAsync(u => u.Id == customerForUpdate.UserId);
                    if (customerAccount != null && customerAccount.Id > 0)
                    {
                        customerAccount.LockoutEnabled = true;
                        customerAccount.LockoutEnd = DateTimeHelper.CurrentTime().AddMinutes(-20);
                        await _userRepository.UpdateAsync(customerAccount);
                    }
                }

            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.Message;
            }

            return result;
        }
        #endregion

        #region AssignManager
        /// <summary>
        /// Lấy thông tin người quản lý theo Id khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <returns>Thông tin người quản lý.</returns>
        public async Task<AssignManagerModel> GetManagerById(int id)
        {
            var result = new AssignManagerModel();
            if (id <= 0)
            {
                return result;
            }
            var customer = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customer == null || customer.Id <= 0)
            {
                return result;
            }
            result.ManagerId = customer.ManagerId;
            if (result.ManagerId > 0)
            {
                var user = await _userRepository.Query().FirstOrDefaultAsync(u => u.Id == customer.ManagerId);
                if (user != null && user.Id > 0)
                {
                    result.ManagerUserName = user.UserName;
                    result.ManagerFullName = user.FullName;
                }
            }
            return result;
        }

        /// <summary>
        /// Gán người quản lý cho khách hàng.
        /// </summary>
        /// <param name="model">Thông tin người quản lý.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<BaseResult> AssignManager(AssignManagerModel model)
        {
            var result = new BaseResult();

            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == model.Id);
            if (customerForUpdate == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không tìm thấy bản ghi yêu cầu";
                return result;
            }
            try
            {
                customerForUpdate.ManagerId = model.ManagerId;
                customerForUpdate = customerForUpdate.UpdateCommonInt(model.UpdatedBy, model.UpdatedByUserName);
                await _customerRepository.UpdateAsync(customerForUpdate);
            }
            catch (Exception e)
            {
                result.Result = Result.SystemError;
                result.Message = e.Message;
            }

            return result;
        }
        #endregion

        /// <summary>
        /// Cập nhật trạng thái khách hàng.
        /// </summary>
        /// <param name="id">Id của khách hàng.</param>
        /// <param name="status">Trạng thái khách hàng.</param>
        /// <returns>Kết quả của thao tác.</returns>
        public async Task<bool> UpdateCustomerStatus(int id, CustomerStatus status)
        {
            var customerForUpdate = await _customerRepository.Query().FirstOrDefaultAsync(c => c.Id == id);
            if (customerForUpdate == null)
            {
                return false;
            }

            try
            {
                customerForUpdate.Status = status;
                customerForUpdate = customerForUpdate.UpdateCommonInt();
                await _customerRepository.UpdateAsync(customerForUpdate);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}

