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

export default {
  // ==================== FUEL CARD APIs ====================

  /**
   * Tìm kiếm thẻ xăng dầu
   * @param {Object} params - SmartTableParam với Pagination, Search, Sort
   * @returns {Promise<Object>} - { Items, TotalRecord, NumberOfPages }
   */
  async searchFuelCards(params) {
    const payload = JSON.parse(JSON.stringify(params));
    const result = await apiClient
      .post(apiPath.fuelCard.search, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error searching fuel cards:", e);
        return { Items: [], TotalRecord: 0, NumberOfPages: 0 };
      });
    return result;
  },

  /**
   * Lấy thông tin thẻ theo ID
   * @param {Number} id - ID thẻ xăng dầu
   * @returns {Promise<Object>} - FuelCardItem
   */
  async getFuelCardById(id) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getById}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting fuel card by id:", e);
        return null;
      });
    return result;
  },

  /**
   * Tạo hoặc cập nhật thẻ
   * @param {Object} data - FuelCardItem (Id = 0 để tạo mới)
   * @returns {Promise<Object>} - { Result, Message }
   */
  async createOrUpdateFuelCard(data) {
    const payload = JSON.parse(JSON.stringify(data));
    const result = await apiClient
      .post(apiPath.fuelCard.createOrUpdate, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error creating/updating fuel card:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Xóa thẻ
   * @param {Number} id - ID thẻ xăng dầu
   * @returns {Promise<Object>} - { Result, Message }
   */
  async deleteFuelCard(id) {
    const result = await apiClient
      .post(`${apiPath.fuelCard.delete}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error deleting fuel card:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Gán thẻ cho xe
   * @param {Number} fuelCardId - ID thẻ xăng dầu
   * @param {Number} truckId - ID xe tải
   * @returns {Promise<Object>} - { Result, Message }
   */
  async assignToTruck(fuelCardId, truckId) {
    const result = await apiClient
      .post(`${apiPath.fuelCard.assignToTruck}?fuelCardId=${fuelCardId}&truckId=${truckId}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error assigning fuel card to truck:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Lấy danh sách thẻ đang hoạt động
   * @returns {Promise<Array>} - Array of FuelCardItem
   */
  async getActiveCards() {
    const result = await apiClient
      .get(apiPath.fuelCard.getActiveCards)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting active cards:", e);
        return [];
      });
    return result;
  },

  /**
   * Lấy tổng nợ thẻ tín dụng
   * @returns {Promise<Object>} - { TotalDebt }
   */
  async getTotalDebt() {
    const result = await apiClient
      .get(apiPath.fuelCard.getTotalDebt)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting total debt:", e);
        return { TotalDebt: 0 };
      });
    return result;
  },

  // ==================== FUEL CARD TRANSACTION APIs ====================

  /**
   * Import sao kê thẻ từ Excel
   * @param {FormData} formData - File Excel + metadata
   * @returns {Promise<Object>} - { Result, Message }
   */
  async importStatement(formData) {
    const result = await apiClient
      .post(apiPath.fuelCard.importStatement, formData, {
        headers: { "Content-Type": "multipart/form-data" },
      })
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error importing statement:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Import lịch sử giao dịch thẻ từ Excel
   * @param {FormData} formData - File Excel + metadata (OverwriteExisting, FromDate, ToDate)
   * @returns {Promise<Object>} - { Result, Message, ... }
   */
  async importTransactionHistory(formData) {
    const result = await apiClient
      .post(apiPath.fuelCard.importTransactionHistory, formData, {
        headers: { "Content-Type": "multipart/form-data" },
      })
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error importing transaction history:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Tìm kiếm giao dịch thẻ
   * @param {Number} fuelCardId - ID thẻ (optional)
   * @param {Object} params - SmartTableParam
   * @returns {Promise<Object>} - { Items, TotalRecord, NumberOfPages }
   */
  async searchTransactions(fuelCardId, params) {
    const payload = JSON.parse(JSON.stringify(params));
    const url = fuelCardId
      ? `${apiPath.fuelCard.searchTransactions}?fuelCardId=${fuelCardId}`
      : apiPath.fuelCard.searchTransactions;
    const result = await apiClient
      .post(url, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error searching transactions:", e);
        return { Items: [], TotalRecord: 0, NumberOfPages: 0 };
      });
    return result;
  },

  /**
   * Lấy chi tiết giao dịch
   * @param {String} id - ID giao dịch (GUID)
   * @returns {Promise<Object>} - FuelCardTransactionItem
   */
  async getTransactionById(id) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getTransactionById}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting transaction by id:", e);
        return null;
      });
    return result;
  },

  /**
   * Đối soát giao dịch với lần đổ dầu
   * @param {String} transactionId - ID giao dịch thẻ (GUID)
   * @param {Number} fuelRefillId - ID lần đổ dầu
   * @returns {Promise<Object>} - { Result, Message }
   */
  async reconcileTransaction(transactionId, fuelRefillId) {
    const result = await apiClient
      .post(
        `${apiPath.fuelCard.reconcileTransaction}?transactionId=${transactionId}&fuelRefillId=${fuelRefillId}`
      )
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error reconciling transaction:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Đánh dấu đã thanh toán cho ngân hàng
   * @param {String} id - ID giao dịch (GUID)
   * @returns {Promise<Object>} - { Result, Message }
   */
  async markTransactionPaid(id) {
    const result = await apiClient
      .post(`${apiPath.fuelCard.markTransactionPaid}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error marking transaction paid:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Lấy giao dịch chưa đối soát theo thẻ và ngày
   * @param {Number} fuelCardId - ID thẻ xăng dầu
   * @param {Date|DateTimeOffset} date - Ngày giao dịch
   * @returns {Promise<Array>} - Array of FuelCardTransactionItem
   */
  async getUnreconciledTransactions(fuelCardId, date) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getUnreconciledTransactions}?fuelCardId=${fuelCardId}&date=${date.toISOString()}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting unreconciled transactions:", e);
        return [];
      });
    return result;
  },

  // ==================== FUEL REFILL APIs ====================

  /**
   * Tạo hoặc cập nhật thông tin đổ dầu (Core Feature)
   * @param {FormData} formData - Form data với Id, Files và MediaTypes (Id=0 để tạo mới, Id>0 để cập nhật)
   * @returns {Promise<Object>} - { Result, Message }
   */
  async createOrUpdateRefill(formData) {
    const result = await apiClient
      .post(apiPath.fuelCard.createOrUpdateRefill, formData, {
        headers: { "Content-Type": "multipart/form-data" },
      })
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error creating/updating fuel refill:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Tìm kiếm lịch sử đổ dầu
   * @param {Object} params - SmartTableParam
   * @returns {Promise<Object>} - { Items, TotalRecord, NumberOfPages }
   */
  async searchRefills(params) {
    const payload = JSON.parse(JSON.stringify(params));
    const result = await apiClient
      .post(apiPath.fuelCard.searchRefills, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error searching refills:", e);
        return { Items: [], TotalRecord: 0, NumberOfPages: 0 };
      });
    return result;
  },

  /**
   * Lấy chi tiết lần đổ dầu
   * @param {Number} id - ID lần đổ dầu
   * @returns {Promise<Object>} - FuelRefillItem
   */
  async getRefillById(id) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getRefillById}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting refill by id:", e);
        return null;
      });
    return result;
  },

  /**
   * Lấy lịch sử đổ dầu theo xe
   * @param {Number} truckId - ID xe tải
   * @returns {Promise<Array>} - Array of FuelRefillItem
   */
  async getRefillsByTruck(truckId) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getRefillsByTruck}/${truckId}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting refills by truck:", e);
        return [];
      });
    return result;
  },

  /**
   * Lấy lịch sử đổ dầu theo lái xe
   * @param {Number} driverId - ID lái xe
   * @returns {Promise<Array>} - Array of FuelRefillItem
   */
  async getRefillsByDriver(driverId) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getRefillsByDriver}/${driverId}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting refills by driver:", e);
        return [];
      });
    return result;
  },

  /**
   * Xóa bản ghi đổ dầu
   * @param {Number} id - ID bản ghi đổ dầu
   * @returns {Promise<Object>} - { Result, Message }
   */
  async deleteRefill(id) {
    const result = await apiClient
      .post(`${apiPath.fuelCard.deleteRefill}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error deleting refill:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Xuất Excel lịch sử đổ dầu
   * @param {Object} params - Search và Sort parameters (không có Pagination)
   * @returns {Promise<Object>} - { Result, Message, FilePath, FileName, FileSize, TotalRecords, DownloadUrl, ... }
   */
  async exportRefillsExcel(params) {
    const payload = JSON.parse(JSON.stringify(params));
    const result = await apiClient
      .post(apiPath.fuelCard.exportRefillsExcel, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error exporting refills excel:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  // ==================== DRIVER FUEL QUOTA APIs ====================

  /**
   * Lấy số dư dầu khoán của lái xe
   * @param {Number} driverId - ID lái xe
   * @returns {Promise<Object>} - DriverFuelQuotaBalanceItem
   */
  async getDriverQuotaBalance(driverId) {
    const result = await apiClient
      .get(`${apiPath.fuelCard.getDriverQuotaBalance}/${driverId}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error getting driver quota balance:", e);
        return null;
      });
    return result;
  },

  /**
   * Tìm kiếm lịch sử chênh lệch dầu
   * @param {Number} driverId - ID lái xe (optional)
   * @param {Object} params - SmartTableParam
   * @returns {Promise<Object>} - { Items, TotalRecord, NumberOfPages }
   */
  async searchDriverQuotaHistory(driverId, params) {
    const payload = JSON.parse(JSON.stringify(params));
    const url = driverId
      ? `${apiPath.fuelCard.searchDriverQuotaHistory}?driverId=${driverId}`
      : apiPath.fuelCard.searchDriverQuotaHistory;
    const result = await apiClient
      .post(url, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error searching driver quota history:", e);
        return { Items: [], TotalRecord: 0, NumberOfPages: 0 };
      });
    return result;
  },

  /**
   * Điều chỉnh số dư thủ công (Admin)
   * @param {Number} driverId - ID lái xe
   * @param {Number} adjustmentLiters - Số lít điều chỉnh (+ hoặc -)
   * @param {String} notes - Lý do điều chỉnh
   * @returns {Promise<Object>} - { Result, Message }
   */
  async adjustDriverQuota(driverId, adjustmentLiters, notes) {
    const result = await apiClient
      .post(
        `${apiPath.fuelCard.adjustDriverQuota}?driverId=${driverId}&adjustmentLiters=${adjustmentLiters}&notes=${encodeURIComponent(
          notes
        )}`
      )
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error adjusting driver quota:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  // ==================== FUEL QUOTA PAYMENT APIs ====================

  /**
   * Tạo phiếu thanh toán
   * @param {Object} data - FuelQuotaPaymentItem
   * @returns {Promise<Object>} - { Result, Message }
   */
  async createPayment(data) {
    const payload = JSON.parse(JSON.stringify(data));
    const result = await apiClient
      .post(apiPath.fuelCard.createPayment, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error creating payment:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Duyệt thanh toán
   * @param {Number} id - ID phiếu thanh toán
   * @returns {Promise<Object>} - { Result, Message }
   */
  async approvePayment(id) {
    const result = await apiClient
      .post(`${apiPath.fuelCard.approvePayment}/${id}`)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error approving payment:", e);
        return { Result: 3, Message: "Lỗi hệ thống" };
      });
    return result;
  },

  /**
   * Tìm kiếm lịch sử thanh toán
   * @param {Object} params - SmartTableParam
   * @returns {Promise<Object>} - { Items, TotalRecord, NumberOfPages }
   */
  async searchPayments(params) {
    const payload = JSON.parse(JSON.stringify(params));
    const result = await apiClient
      .post(apiPath.fuelCard.searchPayments, payload)
      .then((r) => {
        if (r.data) return r.data;
      })
      .catch((e) => {
        console.error("Error searching payments:", e);
        return { Items: [], TotalRecord: 0, NumberOfPages: 0 };
      });
    return result;
  },
};
