import apiClient from "@/infrastructure/apiClient";
import apiPath from "@/infrastructure/apiPath";

export default {
  /**
   * Tìm kiếm thông tin VAT
   * @param {Object} searchModel - Điều kiện tìm kiếm
   * @returns {Promise<Object>} Kết quả tìm kiếm
   */
  async search(searchModel) {
    try {
      const params = JSON.parse(JSON.stringify(searchModel));
      const response = await apiClient.post(apiPath.vatInfo.search, params);
      return response.data || { items: [], totalRecord: 0, numberOfPages: 0 };
    } catch (error) {
      console.error("Error searching VAT info:", error);
      return { items: [], totalRecord: 0, numberOfPages: 0 };
    }
  },

  /**
   * Lấy chi tiết thông tin VAT theo ID
   * @param {number} id - ID thông tin VAT
   * @returns {Promise<Object>} Chi tiết thông tin VAT
   */
  async getById(id) {
    try {
      const response = await apiClient.get(`${apiPath.vatInfo.getById}${id}`);
      return response.data || {};
    } catch (error) {
      console.error("Error getting VAT info by ID:", error);
      return {};
    }
  },

  /**
   * Lấy thông tin VAT mặc định theo khách hàng
   * @param {number} customerId - ID khách hàng
   * @returns {Promise<Object>} Thông tin VAT mặc định
   */
  async getDefaultByCustomerId(customerId) {
    try {
      const response = await apiClient.get(
        `${apiPath.vatInfo.getDefaultByCustomerId}${customerId}`
      );
      return response.data || {};
    } catch (error) {
      console.error("Error getting default VAT info by customer ID:", error);
      return {};
    }
  },

  /**
   * Tạo mới hoặc cập nhật thông tin VAT
   * @param {Object} model - Dữ liệu thông tin VAT
   * @returns {Promise<Object>} 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(
        apiPath.vatInfo.createOrUpdate,
        params
      );
      return response.data || {};
    } catch (error) {
      console.error("Error creating/updating VAT info:", error);
      throw error;
    }
  },

  /**
   * Xóa thông tin VAT
   * @param {number} id - ID thông tin VAT
   * @returns {Promise<Object>} Kết quả xóa
   */
  async delete(id) {
    try {
      const response = await apiClient.delete(`${apiPath.vatInfo.delete}${id}`);
      return response.data || {};
    } catch (error) {
      console.error("Error deleting VAT info:", error);
      throw error;
    }
  },

  /**
   * Đặt thông tin VAT làm mặc định
   * @param {number} id - ID thông tin VAT
   * @returns {Promise<Object>} Kết quả đặt mặc định
   */
  async setAsDefault(id) {
    try {
      const response = await apiClient.put(
        `${apiPath.vatInfo.setAsDefault}${id}`
      );
      return response.data || {};
    } catch (error) {
      console.error("Error setting VAT info as default:", error);
      throw error;
    }
  },

  /**
   * Lấy danh sách thông tin VAT theo khách hàng (sử dụng search với customerId)
   * @param {number} customerId - ID khách hàng
   * @returns {Promise<Array>} Danh sách thông tin VAT
   */
  async getByCustomerId(customerId) {
    try {
      const searchModel = {
        Pagination: {
          PageIndex: 1,
          PageSize: 100,
          Total: 0,
        },
        Search: {
          PredicateObject: {
            CustomerId: customerId,
          },
        },
        Sort: {
          Predicate: "",
          Reverse: true,
        },
      };
      const params = JSON.parse(JSON.stringify(searchModel));

      var param = {
        Pagination: {
          Total: 0,
          PageIndex: 1,
          PageSize: 25,
        },
        Sort: {
          Predicate: "",
          Reverse: true,
        },
        Search: {
          PredicateObject: {
            Keyword: "",
            CreatedStart: null,
            CreatedEnd: null,
            Status: null,
          },
        },
      };

      const result = await this.search(params);
      return result.Items || [];
    } catch (error) {
      console.error("Error getting VAT info by customer ID:", error);
      return [];
    }
  },
};
