import {ofetch} from "ofetch";

const BASE_URL = '/';
const isDev = import.meta.env.DEV;

function encodeBase64Unicode(str) {
    return btoa(new TextEncoder().encode(str).reduce((data, byte) => data + String.fromCharCode(byte), ''));
}

export const apiFetch = ofetch.create({
    throwHttpErrors: true,
    onRequest({request, options}) {
        const data = window.Telegram?.WebApp?.initData;

        if (data) {
            const encoded = encodeBase64Unicode(data);
            options.headers = {
                ...(isDev && {'XDEBUG_TRIGGER': 'PHPSTORM'}),
                ...options.headers,
                'X-Telegram-InitData': encoded,
            };
        }
    },
});

async function ftch(action, query = null, json = null) {
    const options = {
        method: json ? 'POST' : 'GET',
    };
    if (query) options.query = query;
    if (json) options.body = json;

    const xDebugTrigger = isDev ? '&XDEBUG_TRIGGER=phpstorm' : '';

    return await apiFetch(
        `${BASE_URL}index.php?route=extension/tgshop/handle&api_action=${action}${xDebugTrigger}`,
        options
    );
}

async function ftchPost(action, json = {}) {
    return ftch(action, null, json);
}

export async function storeOrder(data) {
    return ftch('storeOrder', null, data);
}

export async function getCart() {
    return await ftch('getCart');
}

export async function addToCart(data) {
    return await apiFetch(`${BASE_URL}index.php?route=checkout/cart/add`, {
        method: 'POST',
        body: data,
    });
}

export async function cartRemoveItem(data) {
    return await apiFetch(`${BASE_URL}index.php?route=checkout/cart/remove`, {
        method: 'POST',
        body: data,
    });
}

export async function cartEditItem(data) {
    return await apiFetch(`${BASE_URL}index.php?route=checkout/cart/edit`, {
        redirect: 'manual',
        method: 'POST',
        body: data,
    });
}

export async function fetchSettings() {
    return await ftch('settings');
}

export async function getFiltersForMainPage() {
    return await ftch('filtersForMainPage');
}

export async function setCoupon(coupon) {
    const formData = new FormData();
    formData.append('coupon', coupon);

    return await apiFetch(`${BASE_URL}index.php?route=extension/total/coupon/coupon`, {
        method: 'POST',
        body: formData,
    });
}

export async function setVoucher(voucher) {
    const formData = new FormData();
    formData.append('voucher', voucher);

    return await apiFetch(`${BASE_URL}index.php?route=extension/total/voucher/voucher`, {
        method: 'POST',
        body: formData,
    });
}

export async function processBlock(block) {
    return await ftch('processBlock', null, block);
}

/**
 * Сохранить или обновить данные Telegram-пользователя
 * @param {Object} userData - Данные пользователя из Telegram.WebApp.initDataUnsafe.user
 * @returns {Promise}
 */
export async function saveTelegramCustomer(userData) {
    return await ftch('saveTelegramCustomer', null, {
        user: userData,
    });
}

export async function checkIsUserPrivacyConsented() {
    return await ftch('checkIsUserPrivacyConsented');
}

export async function userPrivacyConsent() {
    return await ftch('userPrivacyConsent');
}

export async function ingest(data) {
    return await ftchPost('ingest', data);
}

export async function heartbeat() {
    return await ftch('heartbeat');
}

export async function fetchProductById(productId) {
    return await ftch('product_show', {
        id: productId,
    });
}

export async function fetchProductImages(productId) {
  return await ftch('getProductImages', {
    id: productId,
  });
}

export default ftch;
