import apiClient from "@/infrastructure/apiClient";
import { userBankAccount } from "@/infrastructure/apiPaths/userBankAccountPath";

export default {
  /**
   * Tìm kiếm tài khoản ngân hàng người dùng với phân trang
   * @param {Object} searchModel - Model tìm kiếm với Pagination, Sort, Filters
   * @returns {Promise} - Kết quả tìm kiếm với Data, TotalCount, Page, PageSize
   */
  async search(searchModel) {
    try {
      const params = JSON.parse(JSON.stringify(searchModel));
      const response = await apiClient.post(userBankAccount.search, params);
      return response.data;
    } catch (error) {
      console.error('Error searching user bank accounts:', error);
      throw this.handleError(error, 'Tìm kiếm tài khoản ngân hàng');
    }
  },

  /**
   * Lấy thông tin chi tiết tài khoản ngân hàng theo ID
   * @param {number} id - ID của tài khoản ngân hàng
   * @returns {Promise} - Thông tin chi tiết tài khoản ngân hàng
   */
  async getById(id) {
    try {
      const response = await apiClient.get(`${userBankAccount.getById}?id=${id}`);
      return response.data;
    } catch (error) {
      console.error('Error getting user bank account by id:', error);
      throw this.handleError(error, 'Lấy thông tin tài khoản ngân hàng');
    }
  },

  /**
   * Tạo mới hoặc cập nhật tài khoản ngân hàng
   * @param {Object} model - Dữ liệu tài khoản ngân hàng
   * @returns {Promise} - Kết quả tạo/cập nhật
   */
  async createOrUpdate(model) {
    try {
      const params = JSON.parse(JSON.stringify(model));
      const response = await apiClient.post(userBankAccount.createOrUpdate, params);
      return response.data;
    } catch (error) {
      console.error('Error creating/updating user bank account:', error);
      throw this.handleError(error, 'Tạo/cập nhật tài khoản ngân hàng');
    }
  },

  /**
   * Xóa tài khoản ngân hàng
   * @param {number} id - ID của tài khoản ngân hàng cần xóa
   * @returns {Promise} - Kết quả xóa
   */
  async delete(id) {
    try {
      const params = { Id: id };
      const response = await apiClient.post(userBankAccount.delete, params);
      return response.data;
    } catch (error) {
      console.error('Error deleting user bank account:', error);
      throw this.handleError(error, 'Xóa tài khoản ngân hàng');
    }
  },

  /**
   * Xử lý lỗi API một cách thống nhất
   * @param {Error} error - Lỗi từ API
   * @param {string} context - Ngữ cảnh của action
   * @returns {Error} - Lỗi đã được xử lý
   */
  handleError(error, context) {
    if (error.response) {
      const { status, data } = error.response;
      switch (status) {
        case 400:
          return new Error(data.message || 'Dữ liệu không hợp lệ');
        case 401:
          return new Error('Phiên đăng nhập đã hết hạn');
        case 403:
          return new Error('Bạn không có quyền thực hiện hành động này');
        case 404:
          return new Error('Không tìm thấy tài khoản ngân hàng');
        case 500:
          return new Error('Lỗi máy chủ, vui lòng thử lại sau');
        default:
          return new Error(data.message || `Lỗi ${context}`);
      }
    } else if (error.request) {
      return new Error('Không thể kết nối đến máy chủ');
    } else {
      return new Error(error.message || `Lỗi ${context}`);
    }
  }
};
